このブログでもSSL対応したいと思いつつ後回しにしてきたのですが、最近Let’s EncryptでSSLを取得してみたらチョー簡単になっていたのでHappyqualityもSSLに対応してみました。
CertBotというソフトウェアを使うのですが、対話式コマンドでSSLの取得から設定までぜーんぶやってくれます。
解説の必要もないほど簡単ですが、社内メモとして残しておきます。
環境は
CentOS release 6.9
Apache2.2.15
CertBotのインストール
たったこれだけ
sudo yum install epel-release wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto
場所は特にこだわりがなければホームディレクトリでいいでしょう。
個別ユーザのhomeディレクトリでも問題はありませんが、証明書の更新をcrontabで設定する時にnginxの再起動のためにroot権限で実行する必要があるので/usr/local
などに設置したほうが良いかもしれません。
証明書取得とサーバの設定
インストールした場所で以下のコマンドを実行するとcertbotの対話式コマンドが走ります。
./certbot-auto
必要なパッケージのインストールが始まり
... トランザクションの要約 ============================================================================================================================================================== インストール 20 パッケージ アップグレード 21 パッケージ 総ダウンロード容量: 46 M これでいいですか? [y/N]
と聞かれるのでy
エンター。
次に更新やセキュリティの通知メールを送るためのメールアドレスを聞かれるので自分のアドレスを登録しておきます。
c
でキャンセルもできます。
Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel):自分のメールアドレス
次に利用規約を読んで同意してくれと言われるので、シッカリ読んだうえでA
エンター。
------------------------------------------------------------------------------- Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v01.api.letsencrypt.org/directory ------------------------------------------------------------------------------- (A)gree/(C)ancel:
次にElectronic Frontier Foundationのメールを受け取る?みたいなことを聞かれるので
------------------------------------------------------------------------------- Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about EFF and our work to encrypt the web, protect its users and defend digital rights. ------------------------------------------------------------------------------- (Y)es/(N)o:
好みに応じて。
この設問が終わると、スゴいことが起こります。
Apacheのバーチャルホストの設定を読んで「どの名前をHTTPSに対応する?」って聞かれるので、対応する数字で答えてエンター。
Which names would you like to activate HTTPS for? ------------------------------------------------------------------------------- 1: example.com 2: ex2.example.com 3: ex3.example.com ...設定されてる数だけリストされます ------------------------------------------------------------------------------- Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel):
すると、Let’s Encryptでの証明書取得を行ってくれて、それが終わるとvhost-le-ssl.conf
にSSL用のホストも追加してくれます。
最後に「httpのアクセスをhttpsにリダイレクトしとく?」って聞いてくれるので
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. ------------------------------------------------------------------------------- 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. -------------------------------------------------------------------------------
httpを残さないなら2
でエンター。
ただしiptables
などのファイアーウォールでポート443へのアクセスを許していなかったりするとサイトが表示されなくなってしまうので注意しましょう(笑) *1
この項目で2
のリダイレクトを選ぶと、元のバーチャルホストの設定にRewriteModでリダイレクトする記述を追加してくれています。
もしhttpsのアクセスでサイトが見れなくなったりしたら追加されたRewriteの記述をコメントアウトしましょう。
CertBotのインストールからSSLの導入完了まで5分で終わりました。この記事を書く時間のほうがよっぽど長かったですね(笑)
2018-04-16追記
Nginxの場合
ApacheとNginxの両方がインストールされているサーバでcertbox-auto
を実行すると、最初の設問で
How would you like to authenticate and install certificates? ------------------------------------------------------------------------------- 1: Apache Web Server plugin - Beta (apache) 2: Nginx Web Server plugin - Alpha (nginx) ------------------------------------------------------------------------------- Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
のように、どちらのWeb Serverのサイトを暗号化する?と聞かれます。
Nginxを選択した場合でも、Apache同様に設定されているVirtualhostをリストアップしてくれて選択したホストを自動的にSSL対応してくれます。
リダイレクトの設定もApacheと同じように2: Redirect
を選択すれば自動で設定してくれました。
Let’s Encryptの自動更新設定
Let’s Encryptは90日ごとの更新が必要です。
./certbot-auto renew
というコマンドで30日以内に期限を迎える証明書を更新できますが、毎回手動で実行するわけにはいかないのでcronで自動実行するように設定します。
私はcertbox-auto
をログインユーザのhomeディレクトリに入れてしまいましたが、cronで証明書を更新した後にroot権限でnginxをリスタートする必要があるので、個別のユーザではなく/usr/local
などに入れたほうが良いかもしれませんね。
以下は[user]のホームディレクトリにcertbot-auto
を設置した場合です。
sudo crontab -u root -e
0 4 * * 0 /home/[user]/certbot-auto renew && /etc/init.d/[httpd|nginx] restart
毎週日曜日の朝4時にcertbot-auto renew
してnginxを再起動する記述です。
certbot-auto
のパスは環境に応じて書き換えてください。
[httpd|nginx]は利用しているWEBサーバに応じて記述してください。
- 自分はこれで少し焦りました [↩]