web-dev-qa-db-ja.com

Curlコマンドでクライアント証明書を使用する

カールコマンド:

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

上記で指定したCurlコマンドを使用してクライアント証明書を送信しようとしています。私は次のことを知りたい:

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

  2. HTTPリクエストからサーバー側でクライアント証明書を取得できない場合、HTTPリクエストにカスタムリクエストヘッダーを追加し、そのカスタムヘッダーの値としてクライアント証明書を送信できます。誰かが私にこのアプローチの例を提供できたら素晴らしいと思います。

34
sunsin1985

TLSクライアント証明書はHTTPヘッダーで送信されません。それらは、TLShandshakeの一部としてクライアントによって送信され、サーバーは通常、ハンドシェイク中にも証明書の有効性をチェックします。

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

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

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;
    }
}
25
frasertweedale

これは私がそれをやった方法です:

curl -v \
  --cacert ./ca.pem \
  --key ./admin-key.pem \
  --cert ./admin.pem \
  https://xxxx/api/v1/
91
reachlin