Перейти к содержимому
ecdsa.com
Go crypto/x509Go

Сообщение об ошибке

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», приводя эту причину как вероятную.

Почему это происходит

Как исправить

  1. 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. 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

Связанные ошибки

Открыть всю базу ошибок подписей