エラーメッセージ
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 用のテンプレートから発行された証明書をサーバーにインストールしている場合や、serverAuth を含めずに EKU を手作業で記述した場合が該当します。
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 サーバー証明書には、extendedKeyUsage の serverAuth(この拡張がある場合)と、keyUsage の digitalSignature が必要です。
bash openssl req -new -key server.key -out server.csr -subj "/CN=api.example.com" \ -addext "subjectAltName=DNS:api.example.com" -addext "extendedKeyUsage=serverAuth"