Debian jessie + さくらのVPSでLet’s Encryptを使う

どうやら最近SSL対応のサイトが増えているようで、「暗号化する必要あるんだろうか?」というどうでもいいサイトまでhttpにアクセスするとhttpsにリダイレクトされたりもします。
そうなってくると大手サイトがhttpを使っていると、まだSSL入れてなかったんかいなどと思ったりもします。

スマホもパソコンも速くなった今、全ての通信が暗号化されるのはいいことだと考えております。
かといって個人が証明書にお金払うのは微妙ですし(僕は前払ってましたけどもすごく微妙な気持ちになりました)、オレオレ証明書使うのは更に微妙です。

team2ch.orgもなんとなくSSLを入れてみたくなったので、2016年くらいから話題の「Let’s Encrypt」を使って無料で認証局から証明書を発行してもらいました。
それをApache2で使えるようにするまでの手順を書きます。

1.環境

Debian jessie (Debian 8)
Apache 2.4.10
さくらのVPSの一番安いやつ

2.Debian backportsを有効にする

certbot パッケージを利用するため、Debian backportsを有効にする
(直接ダウンロードしてcertbot-auto を使う方法を紹介しているサイトもありますが、今はbackportsにあるのでbackportsから拾ってきたほうが便利です)

/etc/apt/sources.list

deb http://ftp.debian.org/debian jessie-backports main

を追記後

sudo apt-get update
sudo apt-get install python-certbot-apache -t jessie-backports

3.Let’s Encryptから証明書を発行してもらう

sudo certbot certonly --webroot -w /var/www/<Apache2で公開している場所のパス> -d sample.com(ドメイン名) -m sample@sample.com(Let's Encryptに登録するメールアドレス) --agree-tos -n

certbot のhttpサーバを使って取りに行く方法もあるらしいのですが、--webroot を指定することでApache2にやらせます。
どちらでやってもいいですが、certbot のhttpサーバを使う場合はPort 80の競合を防ぐため一度Apacheをstopする必要があります。

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/team2ch.org/fullchain.pem. Your cert will
expire on 2017-10-07. To obtain a new or tweaked version of this
certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run "certbot
renew"

のような表示が出たら成功です。3ヶ月という微妙な期間の証明書が手に入りました。
放っておくと3ヶ月で賞味期限が切れますが、crontab に登録して週1(月1でも可、但し後述理由により非推奨)で更新させておけば実質的に期限が切れなくなります。

sudo crontab -e

30 1 * * 1 /usr/bin/certbot renew

上の例では毎週月曜日の夜中の1時30分に更新をかけています。
但し、Let’s Encryptの仕様上賞味期限1ヶ月前にならないと更新がかけられないようです。(3ヶ月のうち最初の2ヶ月間はおかわりできない)
なので、月1のcrontab 設定にすると、一度更新できないと期限が切れる可能性が高いです。あまりおすすめできません。

crontab/var/mail/ にメールが貯まるのがうざい人は/dev/null に捨てましょう。

4.Apache2の設定

Apache2のssl modを有効にする

sudo a2enmod ssl

Apache2を再起動

sudo /etc/init.d/apache2 restart

/etc/apache2/sites-enabled/default-ssl.conf を編集する

sites-enabled にあるファイルは全てsimlinkで、実体はsites-available にあるようです。
default-ssl.conf の編集方法は000-default.conf の編集方法と大差ありません。
細かい設定方法は中身を見ていただくとして、注意点があります。

SSLCertificateFile /etc/letsencrypt/live/<ドメイン名>/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/<ドメイン名>/privkey.pem
SSLCACertificateFile /etc/letsencrypt/live/<ドメイン名>/chain.pem

のうちSSLCACertificateFile の設定が抜けている解説サイトが多いのですが、これが抜けているとブラウザで

Firefox:
SEC_ERROR_UNKNOWN_ISSUER

Chrome:
NET::ERR_CERT_AUTHORITY_INVALID

という中間証明書に関するエラーが出ます。Apache 2.4.10でも依然としてchain.pem の設定は必要なようです。

以上でLet’s Encryptから証明書発行後、もらった証明書を使ってApache2でSSLを使えるようにすることができました。

これでhttps://でアクセス可能となるわけですが、HTML内にhttp://から始まる画像やCSSが埋め込まれているとブラウザでエラーが出まくります。
「うちのコードは大体相対参照で書いてるから大丈夫」などと思っていると案外漏れがあるものです。
ブラウザ開いてF12ボタンでも押して、一つずつ直していくしかないですね。
この辺のいきさつについても気が向いたら投稿します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です