【OpenSSL】オレオレ(自己署名)証明書を作成する(EC2)
EC2 のステージング環境で SSL 対応がしたいとの要望があり、まだSSL サーバー証明書の購入ができていなかったこともあり、暫定でオレオレ(自己署名)証明書を作成した。今回は、その備忘録を残しておく。
- オレオレ(自己署名)証明書とは
- OpenSSLのインストール
- OpenSSLの設定
- プライベート認証局(CA)を立てる
- オレオレ(自己署名)証明書を発行する
- 利用するブラウザに、プライベート認証局(CA)を認めさせる
- Nginx に設定する
- まとめ
オレオレ(自己署名)証明書とは
通常、SSL サーバー証明書は任意の認証局(CA)に認証してもらうことで発行される。(認証局を使わせてもらうのに、費用が発生する。)しかしながら、自分でプライベート認証局(CA)を立てて、自分でSSL サーバー証明書を発行することで、仮の認証をしてしまえるのが、オレオレ(自己署名)証明書である。
処理の流れは以下である。
今回は、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
subjectAltName
のDNSは、openssl.cnf
の commonName
と同じにする。
最近のブラウザでは、アクセスするドメイン名を証明書の一般名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. ブラウザに設定する
- Chromeブラウザで、
chrome://settings/security
にアクセスする。 - 「証明書の管理」を選択する。
- 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 に関して、自分で作成することで、認証局などの仕組み含め、全体的に理解することができて、いい機会となった。
それでは、ステキな開発ライフを。