7839

雑草魂エンジニアブログ

【OpenSSL】オレオレ(自己署名)証明書を作成する(EC2)

EC2 のステージング環境で SSL 対応がしたいとの要望があり、まだSSL サーバー証明書の購入ができていなかったこともあり、暫定でオレオレ(自己署名)証明書を作成した。今回は、その備忘録を残しておく。

オレオレ(自己署名)証明書とは

通常、SSL サーバー証明書は任意の認証局(CA)に認証してもらうことで発行される。(認証局を使わせてもらうのに、費用が発生する。)しかしながら、自分でプライベート認証局(CA)を立てて、自分でSSL サーバー証明書を発行することで、仮の認証をしてしまえるのが、オレオレ(自己署名)証明書である。

処理の流れは以下である。

  1. プライベート認証局(CA)を立てる
  2. オレオレ(自己署名)証明書を発行する
  3. 利用するブラウザに、プライベート認証局(CA)を認めさせる

今回は、EC2 のパブリック IPv4 DNSドメインである「amazonaws.com」のワイルドカードSSLサーバー証明書「*.amazonaws.com」を作成してみた。

OpenSSLのインストール

EC2の場合は、defaultでインストールされていたが、もしインストールされていない場合は、インストールが必要である。

$ openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

OpenSSLの設定

以降は、root ユーザーで処理を行うこととする。今回、自作するプライベート認証局を「nginx」というフォルダの中に作成する。(名前は何でもいいが、今回の web サーバーが Nginx のため、nginxとした。)

# rootユーザー切り替え
$ sudo -s
# ディレクトリ移動
$ cd /etc/pki
# defaultのCA設定フォルダを自作する認証局「nginx」にコピーする
$ cp -r CA nginx
# opensslのdefaultの設定ファイルを nginx/ 配下にコピーする
$ cp tls/openssl.cnf nginx/.

openssl.cnf で参照設定がされているファイルを nginx/ 配下に作成する。

$ cd nginx
$ touch index.txt
$ touch index.txt.attr
$ echo 00 > serial
$ echo "subjectAltName=DNS:*.amazonaws.com" > san.ext

subjectAltNameDNSは、openssl.cnfcommonName と同じにする。

最近のブラウザでは、アクセスするドメイン名を証明書の一般名commonNameで判定せず、SAN(Subject Alternative Name)DNS Nameで判定する動作になっているため、SANを設定しておく必要がある。

openssl.cnf を編集する。

$ vim openssl.cnf

変更箇所のみを明示する。

[ CA_default ]
dir             = /etc/pki/nginx #ディレクトリ変更

[ req_distinguished_name ]
countryName_default             = JP #任意に設定
stateOrProvinceName_default    = Tokyo #任意に設定
localityName_default            = Minato-ku #任意に設定
0.organizationName_default      = Test Co. Ltd #任意に設定
organizationalUnitName_default  = Development #任意に設定
commonName                      = *.amazonaws.com #任意に設定

[ usr_cert ]
subjectAltName=@alt_names #末尾に追記する

プライベート認証局(CA)を立てる

1. CAの秘密鍵作成 プライベート認証局(CA)用の秘密鍵を生成する。秘密鍵に設定するパスワードを聞かれるので入力する。

$ openssl genrsa -aes256 -out ./private/cakey.pem 2048

2. CAのCSR(証明書発行要求ファイル)作成 CAの証明書を発行するためのCSRを作成する。(再度、秘密鍵に設定したパスワードを聞かれるので入力する。)

$ openssl req -new -config ./openssl.cnf -key ./private/cakey.pem -out ./cacert.csr

その後、色々質問されるが、基本的にはそのまま Enter で問題ない。(openssl.cnf に設定したので。)ただし、「Common Name」はきちんと設定できていないと、後々エラーが出るので、きちんと設定しておくことをオススメする。

3. CAの証明書作成 CAの証明書を発行する。(再度、秘密鍵に設定したパスワードを聞かれるので入力する。)

$ openssl x509 -in ./cacert.csr -req -signkey ./private/cakey.pem -out ./cacert.pem

オレオレ(自己署名)証明書を発行する

1. サーバー用の秘密鍵作成 サーバー用に秘密鍵を生成する。秘密鍵に設定するパスワードを聞かれるので入力する。(後ほど、パスワードは解除するので適当で大丈夫。)

$ openssl genrsa -aes256 -out ./private/server-with-password.key 2048

2. パスワード解除した秘密鍵作成 生成した秘密鍵から、パスワードを解除した秘密鍵を作成しておく。(再度、秘密鍵に設定したパスワードを聞かれるので入力する。)

$ openssl rsa -in ./private/server-with-password.key -out ./private/server.key

3. サーバー用のCSR(証明書発行要求ファイル)作成 サーバー用の証明書を発行するためのCSRを作成する。

$ openssl req -new -key ./private/server.key -config openssl.cnf -out server.csr

4. オレオレ(自己署名)証明書作成 オレオレ(自己署名)証明書を作成する。

$ openssl ca -config ./openssl.cnf -in ./server.csr -out ./server.crt -extfile san.ext

エラーがなく、y/n の質問を2回されるのでどちらも「y」で回答すれば、無事にオレオレ(自己署名)証明書が作成される。

利用するブラウザに、プライベート認証局(CA)を認めさせる

1. CAの証明書をダウンロードする EC2から、ローカルのデスクトップに、cacert.pem をダウンロードする。

$ scp ec2-user@<--EC2のIPアドレス-->:/etc/pki/nginx/cacert.pem ~/Desktop

2. ブラウザに設定する

  1. Chromeブラウザで、chrome://settings/securityにアクセスする。
  2. 「証明書の管理」を選択する。
  3. Macの場合は、キーチェーンのウィンドウが開くので、プラスボタンを押して、CAの証明書(cacert.pem)の登録を行う

Nginx に設定する

最後に、Nginx に生成したオレオレ(自己署名)証明書を設定をする。

server {
  listen 80;
  listen 443 ssl; #追記する
  server_name _;
  # SSLを追記する
  ssl_certificate /etc/pki/nginx/server.crt;
  ssl_certificate_key /etc/pki/nginx/private/server.key;
  ssl_client_certificate /etc/pki/nginx/cacert.pem;
}
# Nginx の設定に誤りがないか確認する
$ sudo nginx -t
# 再起動して設定を適応する
$ sudo systemctl reload nginx

まとめ

今回は、きちんとオレオレ証明書を作成することができた。いつもなんとなく設定していた SSL に関して、自分で作成することで、認証局などの仕組み含め、全体的に理解することができて、いい機会となった。

それでは、ステキな開発ライフを。