背景
NGINX の HTTPS 構成の場合、ブラウザーには信頼できる認証局 (CA) が組み込まれており、サーバー側はこれらの組織によって発行された証明書を取得するだけでよいため、通常はサーバー側の認証を実装する必要があります。構成が完了すると、ブラウザは証明書自体の有効性を検証し、SSL 経由で通信を暗号化します。
ただし、特殊な場合には、クライアントを検証する必要もあります。現時点では、クライアントが利用可能な証明書を要求した場合にのみ、双方向認証を有効にする必要があります。サーバーインターフェース。
CA と自己署名
CA は権威ある組織によってのみ実行でき、その組織がセキュリティ標準を満たさない場合、ブラウザのメーカーによって「ブロック」されます。少し前までは、WoSign と StartSSL が Mozilla によってブロックされていました。クロム。ただし、独自の CA を構築するため、これは双方向認証構成には影響しません...
便宜上、NGINX ディレクトリで証明書関連の作成を行います:
cd /etc/nginx mkdir sslcd ssl
Make CA private key
openssl genrsa -out ca.key 2048
Make CAルート証明書 (公開鍵)
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
注:
共通名は任意に入力できます
その他入力が必要な情報。エラーを避けるために入力してください。
サーバー側証明書
サーバー側の秘密鍵を作成します
openssl genrsa -out server.pem 1024 openssl rsa -in server.pem -out server.key
リクエストを生成して発行します
注: ここでは usb.dev を使用し、次の NGINX 構成では
を使用します。入力する必要があるその他の情報。エラーを避けるために、 を入力してください。 key -CAcreateserial -days 3650 -out server.crt
クライアント証明書サーバー証明書と同様:
注:
共通名は任意に入力できます
その他の入力が必要な情報。エラーを避けるために、 を入力してください (CA ルート証明書と一致させるため)
これで、必要な証明書がすべて揃ったので、NGINX の構成を開始できます。
NGINX
openssl req -new -key server.pem -out server.csr
ここで、 ssl_client_certificate /etc/nginx/ssl/ca.crt; は、リクエスト内のクライアント証明書が CA によって発行されたかどうかを検証するために CA 証明書を使用することを意味します。
設定後、NGINX をリロードします:
server { listen 443 ssl; server_name usb.dev; access_log off; ssl on; ssl_certificate /etc/nginx/ssl/server.crt; ssl_certificate_key /etc/nginx/ssl/server.key; ssl_client_certificate /etc/nginx/ssl/ca.crt; ssl_verify_client on; location / { proxy_pass http://backend$request_uri; } }
さて、検証を開始できます。
検証のリクエスト
検証プロセスは、他のマシンでもこのマシンでも実行できます。usb.dev を解析できるようにするには、/etc/hosts も設定する必要があります。
service nginx reload
ブラウザを使用している場合は、クライアント証明書を p12 形式にエクスポートする必要があることを確認してください。ここではスキップしてください。私たちは、curl による検証に重点を置いています:
127.0.0.1 usb.dev
ここで --insecure は、自己構築 CA の非権限的な性質を無視することです。検証が正常であれば、幸運です。ここには深い落とし穴があるからです。curl の一部のバージョンでは、エラーが報告されます:
curl --insecure --key client.key --cert client.crt 'https://usb.dev'
これらのエラー報告バージョンのcurlでは、実際には、 -- のパスが厳密に要求される必要があります。 cert の実パラメータは完全に正しい必要があります。たとえば、現在のディレクトリの下で --cert ./client.crt を使用します。 --cert client.crt を使用するのは間違いです。ピットクライミングプロセス中に、プロセス全体を観察するために -v パラメーターが有効になり、アラームが見つかりました:
<html> <head><title>400 No required SSL certificate was sent</title></head> <body bgcolor="white"> <center><h1>400 Bad Request</h1></center> <center>No required SSL certificate was sent</center> <hr><center>nginx/1.11.0</center> </body> </html>