それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Let's Encrpytで「無料のSSL」を作って使う。SNIのvirtualdomain で複数ドメインをまとめてHTTPSに

Let's Encrypt を使うことに。

StartSSLめんどくさいし、オレオレ証明書もブラウザに嫌われるので、Let's Encryptを使うことにしました。

Let's Encrypt 楽チン

手順としては、この流れ。

  1. letsencrypt コマンドの準備
  2. letsencrypt コマンドで証明書作って署名してもらう。
  3. 複数ドメイン分を作って保存。
  4. 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に署名してもらう。

証明書とひとくちに言っても

  • 証明書を作成(公開鍵・秘密鍵
  • 証明書(公開鍵)に署名リクエストを作成
  • 署名リクエストを送り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点に注意して運用すること。

参考資料

Let's Encrypt の使い方 - Let's Encrypt 総合ポータル