Let's Encrypt を使うことに。
StartSSLめんどくさいし、オレオレ証明書もブラウザに嫌われるので、Let's Encryptを使うことにしました。
Let's Encrypt 楽チン
手順としては、この流れ。
- letsencrypt コマンドの準備
- letsencrypt コマンドで証明書作って署名してもらう。
- 複数ドメイン分を作って保存。
- WEBサーバーに仕込む。
名前ベースのバーチャルホスト(name based virtual host ) を SSL で使う。SNIを使う。
letsencrypt のコマンドの準備
必要なコマンドを、git clone でとってくるだけ。
git clone https://github.com/letsencrypt/letsencrypt cd letsencrypt/
git clone が終われば、コマンド準備完了
試しに実行してみる
./letsencrypt-auto --help
これで、プログラムが揃った。
SSL/TLS 証明書を作って処理。
TLSの証明書を作って、CAに署名してもらう。
証明書とひとくちに言っても
という一連の処理が必要。非対称鍵については知っておくと迷わないで済むと思うね。
もちろん使うだけなら、知識なんて要らないんだけども。
letsencrypt ではどうやってる?
letsencryptでは、濫用を防ぐために、ドメインの所有者を確認する。
ドメインの所有者の確認は次の通り。
- リクエスト側(我々)のポート80番でWEBサーバーを起動。
- letsencryptの運営サーバーがドメインのAレコードを見る。
- letsencryptの運営サーバーがポート80番にアクセス
- letsencrypt 側80にアクセス出来たら、そのドメインのownerからの署名リクエストだと確認できる。
という手順で所有者を確認している。
つまり、必要な物は次の通り。
また、80番ポートを使うので、80番ポートを開けておく(FW設定WEBサーバのシャットダウン)が必要
証明書の作成と署名してもらう
DNS の設定をして、ポート80番を閉じたら、次のコマンドを実行した。
./letsencrypt-auto certonly -a standalone -d example.com
途中メアドの入力が必要。
これで、次のようなサーバー証明書一式が作成されて保存される。簡単!
/etc/letsencrypt/live/ └── example.com ├── cert.pem ├── chain.pem ├── fullchain.pem └── privkey.pem
Apacheに仕込む
ApacheのVirtualHost機能で、複数ドメインをまとめてHTTPS化する。
最近のブラウザ、ApacheなどはSNI対応なので、複数ドメイン毎に証明書を設定することで、ドメイン単位でHTTPSが使えるようになっている。ワイルドカードも不要です。
SNIとはServer Name Indicationの略で、バーチャルホストをサーバー名をTLS接続後に交換する方式で、近年のブラウザはほぼ対応してる。使って大丈夫。というか、最近だとIPアドレス毎にSSL1つしか使えない時代を知らない人が増えたんじゃないかな。
ドメインごとの設定
NameVirtualHost *:443 <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost ServerName example.com # ドメイン名 DocumentRoot /var/www/example.com <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/example.com> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> SSLEngine on SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem #中間証明書 SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem #証明書 SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem #秘密鍵 SSLCACertificateFile /etc/letsencrypt/live/example.com/fullchain.pem # CA証明書(中間証明書を含む) </VirtualHost> </IfModule>
最後に、複数ドメイン分を設定して、Apacheを再起動して終了
無事に複数ドメインをSSLに。
ぱぱっと終わっていいよね。
nginx も良いんだけど、Apacheでも十分だよね・・・
thread worker や fcgi 使えばApacheでもあんま変わらないと思うし。
注意点
Let's Encpytは実験サービスなので、いつ無料サポートが終了されてもおかしくない点。
また、署名の有効期限が「3ヶ月」なので、頻繁に更新が必要という点。
この2点に注意して運用すること。