エラーメッセージ
SSL routines:ssl3_read_bytes:tlsv13 alert certificate required
別の表記
- error:0A00045C:SSL routines::tlsv13 alert certificate required
- SSL alert number 116
OpenSSL は「error:0A00045C:SSL routines:ssl3_read_bytes:tlsv13 alert certificate required:…:SSL alert number 116」と出力し、curl は「curl: (56) OpenSSL SSL_read: OpenSSL/<version>: error:0A00045C:SSL routines::tlsv13 alert certificate required, errno 0」と出力します。TLS 1.2 では、同じ状況は通常、代わりに handshake_failure(アラート 40)で終わります。
OpenSSL (client side) — TLS 1.3 alert 116 (certificate_required) from a mutual-TLS server
このエラーの意味
サーバーは相互 TLS を必須としていますが、クライアントが証明書を提示しないまま TLS 1.3 のハンドシェイクを終えたため、サーバーはアラート 116(certificate_required)で応答しました。TLS 1.3 では、クライアントがハンドシェイクは完了したと見なした後でクライアント証明書が検証されます。そのため curl などのツールは、このエラーを接続時ではなく最初の読み取り時に報告します(curl の終了コード 56)。
発生する理由
クライアント証明書が設定されていない
よくあるクライアントに証明書と鍵が渡されていません(--cert を指定していない curl、クライアント証明書のオプションを設定していないライブラリ、証明書がインストールされていない新しいマシンなど)。
クライアントは証明書を持っていたが、受け入れられる CA が発行したものではなかった
ときどき証明書を自動的に選択するクライアント(ブラウザー、一部のライブラリ)は、サーバーの「acceptable CA names」リストに含まれる CA が発行した証明書しか送信しません。一致するものがなければ、何も送信しません。
mTLS サーバーの手前でプロキシが TLS を終端している
ときどきクライアントとサーバーの間にあるロードバランサーやプロキシが最初の TLS 接続を終端し、クライアント証明書を必要とするバックエンドに対して、クライアント証明書なしで独自の接続を開きます。
修正方法
- 1.
クライアント証明書を提示する
証明書と秘密鍵をクライアントに渡してください(curl --cert/--key、s_client -cert/-key、HTTP ライブラリのクライアント証明書オプション)。
bash openssl s_client -connect mtls.example.com:443 -servername mtls.example.com \ -cert client.pem -key client.key -brief </dev/null curl --cert client.pem --key client.key https://mtls.example.com/ - 2.
サーバーが受け入れる CA を確認する
openssl s_client は、サーバーが送信する「Acceptable client certificate CA names」を一覧表示します。使用する証明書は、そのいずれかまでチェーンでつながっていなければなりません。
bash # Which CAs does the server accept client certificates from? openssl s_client -connect mtls.example.com:443 -servername mtls.example.com </dev/null 2>/dev/null \ | sed -n '/Acceptable client certificate CA names/,/^Requested/p' - 3.
証明書そのものを確認する
証明書は有効期間内であり、受け入れられる CA から発行されていなければなりません。また、extendedKeyUsage がある場合は、clientAuth を含んでいなければなりません。
bash # The client certificate must be valid, issued by an accepted CA, and allow clientAuth openssl x509 -in client.pem -noout -subject -issuer -dates -ext extendedKeyUsage
関連するエラー
SSL routines:tls_process_client_certificate:peer did not return a certificateOpenSSL (server side, mutual TLS)SSL routines:ssl3_read_bytes:ssl/tls alert handshake failureOpenSSL (client side)SSL_do_handshake() failed (SSL: error:0A000418:SSL routines::tlsv1 alert unknow…nginx error log / OpenSSL400 No required SSL certificate was sentnginx