クライアント証明書

Nginx のクライアント証明書認証の設定手順

2023年07月07日

1.nginxのクライアント証明書認証設定について

nginx1.15.12でクライアント証明書を使用した認証を行うためには、以下の3つのステップが必要です。

  1. サーバ証明書(SSL証明書)をインストールし、SSL通信を有効にします。なお、サーバ証明書は別途用意する必要があります。
  2. クライアント証明書を発行した認証局の証明書(CA証明書)をインストールし、nginxがクライアント証明書の要求を行うように設定します。
  3. クライアント証明書の失効リスト(CRL)を設定します。

 

2.SSLサーバ証明書のインストール

クライアント証明書認証をするためには、まず nginx の設定で SSL サーバ証明書をインストールして、通信を暗号化(SSL 化)する必要があります。
※SSL サーバ証明書は別途ご用意ください。

  1. SSL サーバ証明書と秘密鍵を Web サーバに保存します。
  2. nginx.conf 設定ファイルの server セクションにて SSL 通信(443 ポート)の有効化、及び以下のデ ィレクティブで設定します。
    • SSL通信(https)の有効化
    • SSLサーバ証明書の指定→ssl_certificate ディレクティブ
    • SSLサーバ証明書の秘密鍵の指定→ssl_certificate_key ディレクティブ

    (例)

    server { 
      listen 443 ssl; 
      ~~~ 
      ssl_certificate “配置 PATH”/server.crt; 
      ssl_certificate_key “配置 PATH”/server.key; 
    } 
  3. nginx 再起動
    Web サーバで以下のコマンドを実行し nginx の再起動(設定のリロード)を実行します。
    nginx -s reload

ここまでで SSL サーバ証明書がインストールされ、SSL 通信(https)が行えるようになります。

3.クライアント証明書認証

3.1. CA証明書の配置

FujiSSLのルート証明書と中間証明書をリポジトリから取得します(後述のAppendix4のルート・中間証明書を使用してください)。これらの証明書は、クライアント証明書認証に必要です。
FujiSSLリポジトリ(https://www.fujissl.jp/repository/)には以下の証明書があります。

ルート証明書:USERTrust RSA Certification Authority.crt
中間CA証明書:FujiSSLRSAClientAuthenticationandSecureEmailCA.crt
CA証明書(fujissl.crt)をサーバに配置してください。

3.2. CA 証明書の設定

nginx.conf の ssserver セクションに、以下のディレクティブで CA証明書のパスを指定します。
(例)

ssl_client_certificate “配置 PATH”/fujissl.crt 

 

3.3. クライアント証明書要求を有効化

クライアント証明書要求を有効化するために、nginx.confファイルのserverセクションに以下のディレクティブを設定します。複数のロケーションがある場合は、OR演算子を使用して指定します。また、FujiSSLの発行局および特定の条件に合致する証明書のみを受け付けるように設定します。

server { 
  listen 443 ssl; 
  ~省略(ホスト名、SSL サーバ証明書 等のディレクティブ)~ 
  ssl_verify_client on; 
  ssl_client_certificate 配置 PATH/nra.crt; 
  ssl_verify_depth 3; 
   
    if ($ssl_client_i_dn !~ "CN=FujiSSL RSA Client Authentication and Secure Email CA") {#←証明書発行元が、FujiSSL発行局"  return 403; 
    } 
    if ($ssl_client_s_dn !~ "E="<メールアドレス>" ") { #←O:の値は、証明書発行時のメールアドレス" 
      return 403; 
    } 
   
  ~~~ 省略
}  

※セキュリティに関連するディレクティブは割愛します。
※設定を有効にする場合は、Web サーバで「nginx -s reload」コマンドを実行して nginx を再起 動(設定をリロード)してください。

【補足】
nginx のドキュメンテーション
参考 URL:http://nginx.org/en/docs/
 

4.失効リスト(CRL)の設定

4.1. CRL の取得

以下の配布ポイントから失効リスト(CRL)を取得します。nginxでは、取得したDER形式のCRLファイルを読み込むことができません。そのため、OpenSSLコマンドを使用してPEM形式に変換し、任意のディレクトリに配置します。後述のサンプルスクリプト内に、PEM変換のコマンド例を示します。
【失効リスト(CRL)の配布ポイント】
・認証局(FujiSSLRSAClientAuthenticationandSecureEmailCA) の失効リスト
http://nijimo.crl.sectigo.com/FujiSSLRSAClientAuthenticationandSecureEmailCA.crl
配布ポイントから取得した失効リストファイル(DER 形式)を PEM 形式に変換し、それをマージしたものを nginx の失効リスト(CRL)ファイル(crl.pem)として設定してください。

4.2. CRL ファイルの設定

以下のディレクティブを使用して、nginx.confのserverセクションで設定します。
(例)
ssl_crl “配置 PATH”/crl.pem

4.3. CRL の自動取得&更新

サンプルスクリプトを修正し、cronなどで自動実行するように設定します。

#!/bin/sh 
cd <<失効リストファイルダウンロードディレクトリ>> 
wget 'http://nijimo.crl.sectigo.com/FujiSSLRSAClientAuthenticationandSecureEmailCA.crl' openssl crl -inform der -in cdp.crl -outform pem -out crl.pem 
cd <<失効リストファイル配置ディレクトリ>> 
rm -f crl.pem 
cp -p /<<失効リストファイルダウンロードディレクトリ>>/crl.pem ./ 
nginx -s reload  

付録1.SSLサーバ証明書のインストール:具体例

「2.SSL サーバ証明書のインストール」について、具体的な値を用いた説明は以下のとおりです。
① SSL サーバ証明書と秘密鍵を Web サーバに保存します(ここでは以下のとおりとします)。 ・SSL サーバ証明書ファイル:server.crt
・SSL サーバ証明書の秘密鍵ファイル:server.key
・Web サーバでの保存先ディレクトリ:/etc/nginx/temp
② nginx.conf 設定ファイルの server セクションにて SSL 通信(443 ポート)の有効化、及び以下のデ ィレクティブで設定します。
・SSL 通信の有効化(A)
・SSL サーバ証明書の指定→ssl_certificate ディレクティブ(B)
・SSL サーバ証明書の秘密鍵の指定→ssl_certificate_key ディレクティブ(C)
以下は、nginx.conf ファイルの server セクションの設定例です。

server { 
  listen 443 ssl; 
  server_name xxxx; #環境に応じて設定 
  ssl_certificate /etc/nginx/temp/server.crt; ssl_certificate_key /etc/nginx/temp/server.key; 
  location / { 
    root /usr/share/nginx/html; 
    index index.html index.htm; 
  } 
  ~~~~(以下省略) 
} 

デフォルトでnginxをインストールすると、設定ファイル(serverセクション)は「/etc/nginx/conf.d/default.conf」になります。nginx.conf設定ファイルはこのファイルを含んでいます。

付録2.クライアント証明書認証:設定の具体例

「3.クライアント証明書認証」の具体的な設定については、以下の説明をご覧ください。

  1. CA 証明書を取得し Web サーバに保存します
    • ・CA 証明書ファイル:fujissl.crt
    • ・Web サーバでの保存先ディレクトリ:/etc/nginx/temp
  2. 次に、nginx.conf設定ファイルのserverセクションでの設定
    • ・クライアント証明書による認証を有効にする
    • ・FujiSSL RSA Client Authentication and Secure Email CA が発行した証明書のみを受け付けるように設定する
        発行局: CN=FujiSSL RSA Client Authentication and Secure Email CA
    • ・条件に合致した証明書は「yourname@example.com」のメールアドレスの証明書のみを受け付けます。
        受け付ける証明書の条件: O=yourname@example.com

 
■nginx.conf 設定ファイルの server セクション設定例

server { 
  listen 443 ssl; 
  server_name xxxx; #環境に応じて設定 
  ssl_certificate /etc/nginx/temp/server.crt; ssl_certificate_key /etc/nginx/temp/server.key; 
  ssl_verify_client on; 
  ssl_verify_depth 3; 
  ssl_client_certificate /etc/nginx/temp/nra.crt; 

   #環境に応じて設定 
    if ($ssl_client_i_dn !~ "CN=FujiSSL RSA Client Authentication and Secure Email CA"){  return 403; 
    } 
    if ($ssl_client_s_dn !~ "E=yourname@example.com"){  return 403; 
    } 
   
  location / { 
    root /usr/share/nginx/html; 
    index index.html index.htm; 
  } 

~~~~(以下省略) 
}

【補足】
・Location は環境に応じて設定してください。

付録3.失効リスト(CRL)の設定:具体例

CRL(失効リスト)の設定に関する具体的な値の説明は以下の通りです。

  1. Webサーバには、配布ポイントから取得したDER形式の失効リストをPEM形式に変換し、マージしたファイルを保存します。保存先ディレクトリは「/etc/nginx/temp」で、失効リストファイルの名前は「crl.pem」です。crl.pemは、ルート認証局と中間認証局の失効ファイルをPEM形式に変換し、マージしたものです。テキストエディタで開くと、その内容が表示されます。
    • ・失効リストファイル:crl.pem
    • ・Web サーバでの保存先ディレクトリ:/etc/nginx/temp
  2. 以下のディレクティブを使用して、nginx.confファイルのserverセクションで設定します。

     
    ■nginx.conf 設定ファイルの server セクション設定例

    server { 
      listen 443 ssl; 
      server_name xxxx; #環境に応じて設定 
      ssl_certificate /etc/nginx/temp/server.crt; 
      ssl_certificate_key /etc/nginx/temp/server.key; 
      ssl_verify_client on; 
      ssl_verify_depth 3; 
      ssl_client_certificate /etc/nginx/temp/nra.crt; 
       #環境に応じて設定 
      if ($ssl_client_i_dn !~ "CN=FujiSSL RSA Client Authentication and Secure Email CA"){ 
        return 403; 
      } 
      if ($ssl_client_s_dn !~ "E=yourname@example.com"){  return 403; 
      } 
       
      ssl_crl /etc/nginx/temp/crl.pem; 
      location / { 
        root /usr/share/nginx/html; 
        index index.html index.htm; 
      } 
    ~~~~(以下省略) 
    }
  3. 配布ポイントの失効リストは定期的に更新されます。そのため、以下の手順でスクリプトを作成し、Webサーバの失効リスト(crl.pem)を自動的に取得&更新するように設定します。
     
    ■スクリプト例

    #!/bin/sh 
    cd /etc/nginx/temp/download 
    wget 'http://nijimo.crl.sectigo.com/FujiSSLRSAClientAuthenticationandSecureEmailCA.crl' openssl crl -inform der -in cdp.crl -outform pem -out crl.pem 
    cd /etc/nginx/temp 
    rm -f crl.pem 
    cp -p /etc/nginx/temp/download/crl.pem ./ 
    nginx -s reload 

    【補足】
    「/etc/nginx/temp/download」は、失効リストファイルをダウンロードするためのディレクトリです。スクリプトを実行する前に、このディレクトリを事前に作成してください。

よく読まれている質問