Сообщение об ошибке
x509: invalid signature: parent certificate cannot sign this kind of certificate
Также выводится как
- x509: certificate signed by unknown authority (possibly because of "x509: invalid signature: parent certificate cannot sign this kind of certificate" while trying to verify candidate authority certificate "Example Issuing Server")
Go оборачивает её так: «x509: certificate signed by unknown authority (possibly because of \"x509: invalid signature: parent certificate cannot sign this kind of certificate\" while trying to verify candidate authority certificate \"<issuer CN>\")». Имя издателя берётся из вашей цепочки сертификатов.
Go crypto/x509 — ConstraintViolationError: the issuer is not a CA (basicConstraints CA:FALSE or missing keyCertSign)
Что это означает
Go нашёл возможного издателя сертификата (его имя указано в кавычках в конце), но этому издателю не разрешено подписывать сертификаты: в его basicConstraints указано CA:FALSE (или их нет вовсе) либо в его keyUsage нет keyCertSign. Поэтому Go отбрасывает его и, не найдя другого пути, сообщает «certificate signed by unknown authority», приводя эту причину как вероятную.
Почему это происходит
Сертификаты подписаны сертификатом без признака CA
частоСамодельные скрипты PKI, которые подписывают серверные сертификаты другим серверным сертификатом, или «промежуточный» сертификат, созданный с профилем по умолчанию (не CA).
Сертификат CA без keyCertSign
иногдаПромежуточный сертификат, у которого keyUsage = только digitalSignature (keyCertSign нет), с точки зрения Go не может выпускать сертификаты.
Сертификат без признака CA в пакете цепочки
иногдаЕсли в пакете на месте промежуточного сертификата лежит другой конечный сертификат, Go пробует использовать его как издателя.
Как исправить
- 1.
Проверьте basicConstraints и keyUsage издателя
У кандидата, указанного в кавычках, должны быть CA:TRUE и keyCertSign. OpenSSL 3.5 сообщает о том же дефекте как об ошибке 79, «invalid CA certificate».
bash # Every issuing certificate needs CA:TRUE (and keyCertSign if keyUsage is present) openssl x509 -in intermediate.pem -noout -subject -ext basicConstraints,keyUsage openssl verify -CAfile root.pem -untrusted intermediate.pem server.pem # OpenSSL 3.5: error 79, invalid CA certificate - 2.
Перевыпустите промежуточный сертификат как CA
Подпишите его с basicConstraints critical CA:TRUE (pathlen по необходимости) и keyUsage keyCertSign, cRLSign, а затем перевыпустите конечные сертификаты или заново постройте для них цепочку.
bash # Issue the intermediate as a real CA printf 'basicConstraints=critical,CA:TRUE,pathlen:0\nkeyUsage=critical,keyCertSign,cRLSign\n' > ca.ext openssl x509 -req -in int.csr -CA root.pem -CAkey root.key -days 1825 -extfile ca.ext -out int.pem