Сообщение об ошибке
verify error:num=26:unsuitable certificate purpose
Также выводится как
- Verify return code: 26 (unsuitable certificate purpose)
- error 26 at 0 depth lookup: unsuitable certificate purpose
s_client выводит «verify error:num=26:…» и «Verify return code: 26 (…)», а openssl verify — «error 26 at <depth> depth lookup: unsuitable certificate purpose». Go выдаёт для той же проблемы сообщение «x509: certificate specifies an incompatible key usage».
OpenSSL CLI (openssl s_client / openssl verify -purpose) — X509_V_ERR_INVALID_PURPOSE
Что это означает
Ошибка OpenSSL 26 (X509_V_ERR_INVALID_PURPOSE): в остальном цепочка действительна, но расширения одного из сертификатов не разрешают назначение, которое проверяется. s_client проверяет, пригоден ли сертификат сервера для назначения «TLS-сервер», поэтому сертификат, у которого в extendedKeyUsage указан только clientAuth (или emailProtection), проверку не проходит; openssl verify проверяет то назначение, которое вы зададите в -purpose.
Почему это происходит
В extendedKeyUsage нет serverAuth
частоСертификаты, выпущенные по шаблонам для аутентификации клиентов или S/MIME и установленные на сервер, либо EKU, вручную составленное без serverAuth.
Сертификат CA используется как серверный
иногдаЕсли сервер отдаёт сертификат, у которого keyUsage ограничено значениями keyCertSign/cRLSign, такой сертификат не проходит проверки назначения TLS-сервера.
EKU промежуточного сертификата не допускает это назначение
иногдаOpenSSL проверяет назначение по всей цепочке вверх: если промежуточный сертификат ограничен другими видами использования, выпущенные им конечные сертификаты непригодны для TLS-серверов.
Как исправить
- 1.
Посмотрите расширения использования ключа
extendedKeyUsage, keyUsage и basicConstraints показывают, для чего можно использовать сертификат; openssl verify -purpose проверяет конкретное назначение.
bash openssl x509 -in server.pem -noout -ext extendedKeyUsage,keyUsage,basicConstraints # Check against the purpose you need: sslserver, sslclient, smimesign, ... openssl verify -CAfile root.pem -purpose sslserver server.pem - 2.
Перевыпустите сертификат для нужного назначения
Сертификату TLS-сервера нужны serverAuth в extendedKeyUsage (если это расширение есть) и digitalSignature в keyUsage.
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com" -addext "extendedKeyUsage=serverAuth"