どうやら最近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_ISSUERChrome:
NET::ERR_CERT_AUTHORITY_INVALID
という中間証明書に関するエラーが出ます。Apache 2.4.10でも依然としてchain.pem
の設定は必要なようです。
以上でLet's Encryptから証明書発行後、もらった証明書を使ってApache2でSSLを使えるようにすることができました。
これでhttps://でアクセス可能となるわけですが、HTML内にhttp://から始まる画像やCSSが埋め込まれているとブラウザでエラーが出まくります。
「うちのコードは大体相対参照で書いてるから大丈夫」などと思っていると案外漏れがあるものです。
ブラウザ開いてF12ボタンでも押して、一つずつ直していくしかないですね。
この辺のいきさつについても気が向いたら投稿します。