category

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

標準化されたWebサービス認証手段の1つに、プライベートCA(オレオレ認証局)からSSLクライアント証明書を発行する手があります。
パスワード認証などと併用することで、セキュリティ強化を図れます。

大まかな工程は以下のとおりです。

  1. OpenSSLをセットアップ。またはopensslインストール済のdockerコンテナを起動
  2. スクリプト類をコピーしてビルド環境を作成
  3. プライベートCA作成
  4. クライアント証明書作成
  5. [各サーバーの設定] CA公開鍵をWebサーバーに設置。Webサーバーに証明書認証の設定(&再起動)
  6. [各ブラウザの設定] クライアント証明書を配布。Webブラウザにインストール

OpenSSLパッケージインストール済Dockerの活用

SSL証明書類の生成にはOpenSSLのコマンド類一式が必要で、たとえばnginxの公式イメージを利用するとインストール済になっているので手軽です。
認証局・証明書のアウトプットは作業ディレクトリ内に出力可能なため、以下のような起動コマンドでホスト上のカレントディレクトリをコンテナにマウントしておけば、コンテナ上の/optディレクトリに保存したものをホスト上で取り出せます。

docker run -it --rm -v `pwd`:/opt nginx bash

作業が完了した際にコンテナのシェルをexitするとコンテナ自体は破棄され(–rmオプション)、証明書類が残ります。

スクリプトのコピー

OpenSSLには認証局生成用のスクリプト&設定ファイルが付属しており、作業ディレクトリにコピー&編集して利用します。
テンプレートとなるスクリプトの場所はディストリビューションにより異なります。Debian(nginxイメージのベースディストリビューション)の場合、dpkg -L opensslコマンドでファイルの所在が分かります。

CA.sh / CA.pl / openssl.cnf といったファイルを利用することになるでしょう。

プライベートCA・クライアント証明書作成時の注意点

証明書類を作成する際の注意点は、有効期限の指定です。
プライベート認証局の証明書、クライアント証明書のいずれにも有効期限があり、いずれかが切れるとHTTP400エラーなどで接続できなくなります。
CAスクリプトで作成する際にはopenssl.cnfのdefault_daysオプションで指定します。また、opensslコマンドで作成するファイルは-daysオプションで指定しなくてはならないケースがあるため注意が必要です。

デフォルト設定が30日となるケースで指定を忘れていると1月後に再作成・再配布が必要になります。

完成した証明書をopenssl x509 -text -noout -in some.cert.pemコマンドで情報表示し、Not After(有効期限)欄が意図した期限になっているかを確認することが重要です。

設置・配布する証明書類

CA構築・証明書作成の過程で秘密鍵やCSRなど多数のファイルを生成することになりますが、最終的に設置するファイルは以下の2点です。

  • プライベートCAの証明書をサーバーに設置
  • クライアント証明書のPKCS#12形式ファイルを配布→Webブラウザにインストール

多くの解説では、ファイル名に以下のような命名ルールを利用しています。

  • key: 秘密鍵
  • req: CSR(Certificate Signing Request)
  • cert: 証明書