本文へスキップ
ecdsa.com
OpenSSL (client side)OpenSSL CLI

エラーメッセージ

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)。

発生する理由

修正方法

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

関連するエラー

署名エラーデータベースをすべて見る