EC2上でオレオレ証明書を作る

環境

  • Amazon Linux AMI 2017.03
  • OpenSSL 1.0.2k-fips 26 Jan 2017

最近はLet's Encryptの登場でめっきり出番が少なくなったオレオレ証明書を作ります。

Let's EncryptのSSL証明書の方が信頼度が高くブラウザ側で設定する必要がありません。
インターネットに公開していない環境でもDNSにTXTレコードを追加すればLet's Encryptの証明書を発行できます。

それでもオレオレ証明書を使いたい人向けの手順です。

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

SSL証明書はどこかしらの認証局(CA)に認証して貰って発行されるのですが、
自分でCAを立てて自分で認証したSSL証明書を発行してしまうというものです。

ざっくりとした流れは以下の通りです。
①オレオレ認証局を立てる
②オレオレ認証局でオレオレ証明書を発行する
③利用ブラウザにオレオレ認証局を認めさせる

以降の手順では「*.hoge.com」というワイルドカードのSSL証明書を作る前提とします。
「*.hoge.com」の部分は作成したいドメインに置き換えてください。

作業ディレクトリ等の準備

EC2にSSHでログインし、以下の通り準備をします。
オレオレ認証局はhogeCAというディレクトリに作成するものとします。

sudo -i
cd /etc/pki
cp -r CA hogeCA
cp tls/openssl.cnf hogeCA/.
cd hogeCA
touch index.txt
echo "00" > serial

また、以前は無かったと思うのですが
最近のブラウザはSAN(subjectAltName)というものを設定しておかないと正規の証明書と認めてくれないようです。
SANを設定するためのファイルを作成しておきます。

echo "subjectAltName=DNS:*.hoge.com" > san.ext

openssl設定変更

以下の通り、今回利用するopenssl.cnfを修正します。

vim ./openssl.cnf

[ CA_default ]セクション修正

作業ディレクトリを変更します。

dir             = /etc/pki/hogeCA

[ req_distinguished_name ]セクション修正

今回の手順で会社所在地などを複数回聞かれるので、デフォルト値を設定しておきます。

countryName_default             = JP
stateOrProvinceName_default     = Tokyo
localityName_default            = Toshima-ku
0.organizationName_default      = Hoge Co. Ltd.

[ usr_cert ]セクション修正

SANを読み込ませるための設定です。

subjectAltName=@alt_names

認証局(CA)構築

CAの秘密鍵作成

CA用の秘密鍵を生成します。
秘密鍵に設定するパスワードを聞かれるので入力してください。

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

CAのCSR(証明書発行要求ファイル)作成

CAの証明書を発行するためのCSRを作成します。
先程のcakey.pemに設定したパスワードを聞かれるので入力してください。
その後、色々質問されます。基本的にそのままEnterで大丈夫ですが、「Common Name」は後で判別が付くように自分のCA名を適当に入れてください。

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

CAの証明書作成

CAの証明書を発行します。
ここでもcakey.pemのパスワードを聞かれるので入力してください。

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

サーバー証明書の発行

実際にサーバーのSSL証明書を発行していきます。
後で分かりやすいように、まずSSL証明書用のファイルを格納するディレクトリを切っておきます。

mkdir hoge_com

SSL用の秘密鍵作成

SSL用に秘密鍵を生成します。
今回も秘密鍵に設定するパスワードを聞かれるので入力してください。
(すぐにパスワードは解除するので適当で良いです)

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

生成した秘密鍵からパスワード無し版の秘密鍵を作成します。
さきほどのパスワードを聞かれるので入力してください。

openssl rsa -in ./hoge_com/server-with-password.key -out ./hoge_com/server.key

SSL用のCSR作成

SSL証明書を発行するためのCSRを作成します。
色々質問されます。基本的にそのままEnterで大丈夫ですが、「Common Name」は設定するドメイン(今回は*.hoge.com)を入れてください。

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

SSL用の証明書発行

SSL証明書を発行します。
cakey.pemのパスワードを聞かれるので、入力してください。

openssl ca -config ./openssl.cnf -in ./hoge_com/server.csr -out ./hoge_com/server.crt -days 825 -extfile san.ext

上記コマンド後、y/nの質問を2回されるのでどちらもyで回答してください。

Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y

WEBサーバー設定

生成したSSL証明書をWEBサーバーに設定します。
Apacheなら以下のようになります。

SSLCertificateFile /etc/pki/hogeCA/hoge_com/server.crt
SSLCertificateKeyFile /etc/pki/hogeCA/hoge_com/server.key

ブラウザ設定

今回作成したSSL証明書をエラーなく表示させるため、
認証局の証明書(/etc/pki/hogeCA/cacert.pem)をブラウザにインポートしてください。

Chromeであれば、以下の手順で認証局の証明書をブラウザにインポートできます。
①認証局の証明書をローカルにダウンロードしておきます。
②Chromeの『設定>プライバシーとセキュリティ>(もっと見る)>証明書の管理』をクリック ③認証局タブの「インポート」をクリックし、cacert.pemを選択してインポートする。
④信頼の設定ウィンドウが開くので、「ウェブサイトの識別でこの証明書を信頼します」にチェックを入れて「OK」をクリックする。

これでオレオレ証明書のページがエラーなく開けるようになります。