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点に注意して運用すること。