SSLクライアント認証に関係する中間証明局とnginxの設定

SSLクライアント認証に関係する中間証明局とnginxの設定

火, 11月 12, 2024

やりたいこと

  • クライアント認証向けに自己CAで署名したクライアント証明書を作成する
  • nginxでクライアント認証周りの設定をする

自己CAと署名

  • CAの秘密鍵:ca.key
  • CA証明書:ca.crt

を作成する.

中間CAの秘密鍵を作成.

openssl genrsa -out ca.key 4096

自己署名中間CA証明書を作成.

openssl req -new -x509 -days 365 -key ca.key -out ca.crt

有効期限を365日としている.関連した情報を聞かれるので回答する.

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:XXX
Locality Name (eg, city) []:XXX
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XXX
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:xxx.xxx.xxx
Email Address []:xxx@xxx.xxx

クライアント証明書の作成

この辺は以前のポストも参照.

  • クライアント秘密鍵:client.key
  • クライアント証明書要求:client.csr
  • クライアント証明書:client.crt

を作成する.

クライアント秘密鍵を作成する.

openssl genrsa -out client.key 4096

クライアント証明書要求を作成する.

openssl req -new -key client.key -out client.csr

関連した情報を聞かれるので回答する.

Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Shibuya
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example, Inc.
Organizational Unit Name (eg, section) []:Customer Support
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

クライアント証明書を作成する.

openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt

有効期限を365日としている.

ブラウザなどへインポートするために,クライアント証明書とクライアント秘密鍵をPKCS#12ファイルへまとめる.

openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt -certfile ca.crt

nginxでのクライアント認証の設定

以下での運用を想定.

  • バーチャルホスト
  • サーバー証明書はLet’s Encryptで発行
  • 先ほど作成したca.crt/etc/nginx/client_certificatesに保存
server {
    listen       80;
    server_name  xxx.xxx.xxx;
    return 301 https://$host$request_uri;
}
server {
       listen       443 ssl http2;
       ssl_protocols TLSv1.2 TLSv1.3;
       ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

       server_name  xxx.xxx.xxx;
       root         /var/www/web;
       index        index.html index.htm;

       ssl_certificate "/etc/letsencrypt/live/xxx.xxx.xxx/fullchain.pem";
       ssl_certificate_key "/etc/letsencrypt/live/xxx.xxx.xxx/privkey.pem";
       ssl_session_cache shared:SSL:1m;
       ssl_session_timeout  10m;

       ssl_client_certificate "/etc/nginx/client_certificates/ca.crt";
       ssl_verify_client on;
       ssl_verify_depth 2;

       location / {
              try_files $uri $uri/ =404;
       }
}

確認

client.p12をブラウザに読み込み,クライアント認証によりアクセスできることを確認する.

必要に応じて,.mobileconfigを作成してiOSデバイスへの読み込みなどをおこなう(参照:iOS | WebページのためのSSLクライアント認証の設定).

最終更新日