Vagrant環境に自己署名証明書(オレオレ証明書)を使用して有効なSSL設定をする

スポンサーリンク

Vagrant の仮想マシンに Nginx を入れてエラーの出ない SSL アクセスが出来るようにします。

自己署名証明書の作成

自己署名証明書(オレオレ証明書)を作成していきます。

opensslコマンドではデフォルトPEM形式エンコードされます。秘密鍵の生成で指定してる-des3は暗号化方式で、他にも-des, -des3, -aes128, -aes192, -aes256などが使用できます。

# RSA秘密鍵の生成
openssl genrsa -des3 -out private.key 2048
# RSA秘密鍵のパスフレーズ解除
cp private.key private.key.org
openssl rsa -in private.key.org -out private.key
# CSRの作成
openssl req -new -key private.key -out public.csr
# CRTの作成
openssl x509 -req -in public.csr -signkey private.key -out public.crt -days 3650
# rootのみ読み取り可能に変更
chmod 400 private.* public.*

CSRの作成では国や組織などの入力を求められますがオレオレ証明書の場合は適当でも問題ありません。ただし以下の箇所については使用するドメインを指定しておきましょう。省略したりドメインが違うと警告有りでのアクセスしかできません。

Common Name (e.g. server FQDN or YOUR name) []:*.example.com

秘密鍵のパスフレーズを解除する理由はサーバ起動の度にパスフレーズの入力を求められるからで、暗号化された秘密鍵は復号化して使うのが一般的です。そのためオレオレ証明書に関しては最初から暗号化しないで作成してもいいと思います。

# 暗号化しないRSA秘密鍵の生成
openssl genrsa -out private.key 2048
# ついでに秘密鍵から公開鍵を生成する方法
openssl rsa -in private.key -pubout -out public.key

CSR と CRT については以下参照。

拡張子 概要
*.csr       Certificate Signing Request (証明書署名要求) の略。公開鍵に署名を施して証明書を発行するために使用し、CSRの作成には秘密鍵が必要。ただしCSRに秘密鍵は含まれない (公開鍵のみ)
*.crt Certificate (証明書) の略。CSRから証明書を発行する。公開鍵に自分の秘密鍵で署名を施して証明書を作るため自己署名 (オレオレ証明書) という。

 RSA鍵、証明書のファイルフォーマットについて - Qiita
 opensslで秘密鍵のパスフレーズを解除する方法

Nginxの設定

Nginxをインストールしてない場合はしてください。

$ sudo apt-get install nginx

/etc/nginx/sites-enabled/defaultに SSL の記述と証明書、秘密鍵を追加します。

server {
        listen 443 ssl;
        server_name dev.example.com;
        ssl_certificate /etc/ssl/private/public.crt;
        ssl_certificate_key /etc/ssl/private/private.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
        ssl_prefer_server_ciphers on;
}

ファイルが編集できたら Nginx を再起動します。

$ sudo service nginx restart
 * Restarting nginx nginx

ブラウザでアクセス

Vagrant 上の仮想マシンの IP が192.168.33.10の場合は、ローカルの/etc/hosts192.168.33.10 dev.example.comを追加しておきます。

ブラウザでhttps://dev.example.comにアクセスすると以下のようにエラーが表示されるかと思います。詳細設定からアクセスするを選択すると一応アクセスは可能です。 f:id:tasukujp:20170130000421p:plain

次はこのエラーを出さないようにして保護された通信にしたいと思います。

仮想マシン内で作成した証明書public.crtをローカルに持ってきてください。キーチェーンアクセスを開いてログインの証明書にドラッグアンドドロップして移動させます。名前の欄に作成時に指定した Common Name の名前で表示されるはずです。ダブルクリックして開き常に信頼に変更します。

f:id:tasukujp:20170130235142p:plain

もう一度https://dev.example.comにアクセスするとエラーが表示されなくなりました。証明書はワイルドカードで作成したので hosts ファイルに追加すればhttps://test.example.comなどでもアクセス可能です。

f:id:tasukujp:20170130235241p:plain