1. ホーム
  2. linux

[解決済み] クライアントから送信されたTLS証明書をサーバー側で読み込むには?

2023-05-04 10:48:08

質問

Curlコマンドを使用して、相互TLSでサービスを呼び出そうとしています。

Curlコマンドを使用しています。

curl -k -vvvv \
  --request POST \
  --header "Content-Type: application/json" \
  --cert client.pem:password \
  --key key.pem \
  "https://test.com:8443/testing"

私は以下のことを調べようとしています。

  1. HTTP リクエストからクライアント証明書を引き出すために、サーバー側で見るべき HTTP リクエスト ヘッダーは何でしょうか。

  2. HTTP リクエストからサーバー側でクライアント証明書を引き出すことができない場合、HTTP リクエストにカスタム リクエスト ヘッダーを追加し、そのカスタム ヘッダーの値としてクライアント証明書を送信することは可能ですか? 誰かがこのアプローチの例を提供してくれると助かります。

どのように解決するのですか?

相互TLSを使用する場合、クライアントがTLS証明書を送信します。

相互 TLS ハンドシェイクでは、TLS クライアント証明書は HTTP ヘッダで送信されません。 それらは、ハンドシェイク中に交換される TLS メッセージの一部としてクライアントによって送信され、サーバーはハンドシェイク中にクライアント証明書を検証します。 大まかに言って、mTLS のハンドシェイクには 2 つの部分があり、クライアントはサーバー証明書を検証して受け入れ、サーバーはクライアント証明書を検証して受け入れます。

クライアント証明書が受け入れられた場合、ほとんどの Web サーバーは、証明書または証明書に含まれる情報をアプリケーションに送信するためのヘッダーを追加するように構成することができます。 環境変数に証明書情報が入力されるのは Apache Nginx で、これらはヘッダを設定するための他のディレクティブで使用することができます。

このアプローチの例として、次の Nginx 設定スニペットはクライアント証明書を検証し、その証明書を用いて SSL_CLIENT_CERT ヘッダを設定して、証明書全体をアプリケーションに渡します。 これは のみ そのため、アプリケーションは証明書を解析し、それが持つ情報に依存することができます。

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/chainedcert.pem;  # server certificate
    ssl_certificate_key /path/to/key;          # server key

    ssl_client_certificate /path/to/ca.pem;    # client CA
    ssl_verify_client on;
    proxy_set_header SSL_CLIENT_CERT $ssl_client_cert;

    location / {
        proxy_pass http://localhost:3000;
    }
}