サーバーにクライアント認証を実装

クライアント証明書
目次

証明書を利用するまでの流れ

STEP
サーバー証明書を作成
STEP
クライアント証明書を作成
STEP
Nginxへ設定

通常の証明書の作成手順

  • 秘密鍵を生成する
  • 秘密鍵を用いてCSRを生成する
  • CSRを用いて証明書を生成する
  • 秘密鍵と証明書をセットにしてWebサイトの通信を暗号化する

サーバー証明書を作成

/etc/nginx に server_certificates というフォルダを作成しここにサーバーの証明書関係を作成します。

$ cd /etc/nginx
$ mkdir server_certificates
$ cd client_certificates

秘密鍵を作成

SSL証明書はCSR(Certificate Signing Request:証明書署名要求)から生成され秘密鍵とペアになるようになっています。SSL証明書は公開鍵なので再発行できますが、秘密鍵は唯一無二の存在です。

sudo openssl genrsa -aes-128-cbc -out server.key 2048

パスワードは控えておきましょう。但し、次のようにパスワードを解除することができます。

$ sudo openssl rsa -in server.key -out server.key

証明書署名要求(.csr)を作成

本来はここで作成する証明書署名要求を認証機関に提出して署名してもらうのですが、今回作るのは自己署名証明書なので、自分で要求して、自分で署名するイメージです。

CSR(Certificate Signing Request:証明書署名要求)とは、「SSL証明書を発行するための申請書」です。CSRには秘密鍵とペアになる「公開鍵」が含まれます。この公開鍵に認証局が署名することで「SSL証明書」になります。

$ sudo openssl req -new -key server.key -out server.csr

以下の項目は必須として入力します。

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

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

自己署名証明書(.crt)を作成

$ sudo openssl x509 -req -days 365 -in server.csr -signkey mugenproxy.key -out server.crt

-days 365  1年間を有効期間としています。

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

/etc/nginx/client_certificates にクライアント証明書関係を作成します。

$ cd /etc/nginx
$ mldir client_certificates 
$ cd client_certificates

クライアント用の鍵を作成

パスワードを設定します。

$ openssl genrsa -des3 -out client.key 4096

パスワードを解除しておくには以下のコマンド

$ sudo openssl rsa -in client.key -out client.key

クライアント用の署名要求(.csr)を作成

$ openssl req -new -key client.key -out client.csr
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Toukyou
Locality Name (eg, city) []:Shinagawa
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Company Ltd
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:****.jp
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 /etc/nginx/server_certificates/server.crt -CAkey /etc/nginx/server_certificates/server.key -CAcreateserial -out client.crt

-days 365 1年間を有効期間としています。

client.crt と client.csr を連結

$ cat client.crt client.csr > clientfullchain.pem

ブラウザにインストールする pfxを作成する

$ openssl pkcs12 -export -out client.pfx -inkey client01.key -in client.crt -certfile /etc/nginx/server_certificates/server.crt

作成した pfx ファイルをダウンロードしてブラウザにインストールし認証をおこないます。クライアント証明書は、これで作成終了です。

Nginxへ設定

$ cd /etc/nginx/conf.d

設定対象のファイルを編集します。
サーバーの証明書はLet’s Encrypt を利用しています。

server {
  listen       443 ssl http2;
  server_name  ***.***;

  ssl_certificate      /etc/letsencrypt/live/***.***/fullchain.pem;
  ssl_certificate_key  /etc/letsencrypt/live/***.***/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/***.***/fullchain.pem;

  #クライアント証明の有効化
  #ssl_verify_client optional; #証明書があれば要求 $ssl_client_verify に SUCCESS か NONE が格納される
  ssl_verify_client on; #証明書を要求

  ssl_client_certificate /etc/nginx/client_certificates/clientfullchain.pem;

  #証明書の階層をたどる深さ efault=1。
  ssl_verify_depth 2;

  $以下略
}

以上です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コスト最小で制作をしたいという意識強め(笑)

コメント

コメントする

コメントは日本語で入力してください。(スパム対策)

CAPTCHA

目次