2017年10月からGoogleが全てのHTTPページに警告を出すことになりました。
それに伴い、今後はサイトがHTTPSとなっているかどうかも、SEOに影響を及ぼすことになってしまったのです。
(恐ろしいですね…)
そこで今回は、無料でSSL証明書を発行することが出来るLet's Encryptを使って、サイトをHTTPSにする方法を書いてみました。
インストール用のシェルも最後に載せてあるので、よかったらそちらもご利用ください。
※シェルだけ欲しいという方はこちらから
→ https://gist.github.com/daiki44/12bb21e71739da70f8ef751c7ead2b8e#file-letsencrypt-sh
実行環境
- CentOS 6
- apache 2.2
1.Let's Encryptとは?
今まで、サイトをSSL化するためには、1年単位でライセンスを購入し、その証明書を用いる必要がありました。
こいつがピンきりですが高いものはめちゃくちゃ高くて、年間数千円~十数万円の費用がかかるのが普通でした。
そこで、「インターネットを介した安全な通信を行う際の、経済面・技術面・教育面での障壁を減らすこと」を指名として活動している、非営利団体のISRG(Internet Security Research Group)が開発したのが、このLet's Encryptなのです。
これを使えば無料かつ、面倒な更新手続き・運用を自動化しながら、安全な通信を行うことが出来るようになります。
2.証明書を発行しよう!
2-1.certbotのインストール
certbotとはLet’s Encryptが提供する、クライアントソフトウェアで、これを使えばSSL証明書の取得・更新作業を自動化出来るようになっています。
今回はこれを使ってサイトのSSL化をしていくので、まずはcertbotをインストールします。
// curlで叩いてパスの通るところへ
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
// 権限付与
$ sudo chmod 700 /usr/bin/certbot-auto
2-2.certbot-autoコマンドで証明書を発行する
certbotのインストールが完了したら、今度は証明書を発行するために、certbot-autoコマンドを叩いていきます。
$ certbot-auto certonly --webroot -w /var/www/hoge -d hoge.com --email hoge@hoge.com
// certbot-autoコマンドの詳細
certbot-auto certonly // 証明書の作成
--webroot // 既存のウェブサーバを使うモードを選択
-w /var/www/hoge // ドキュメント・ルートのパス
-d hoge.com // 認証するドメイン名
--email <メール>@<アドレス> // メールアドレス登録 (証明書期限切れの通知用)
下記のようなメッセージが出たら、無事、発行完了です。
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/hoge/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/hoge/privkey.pem
Your cert will expire on 2017-12-23. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
2-3.apacheに証明書を設定
証明書が発行されると、
/etc/letsencrypt/live に置かれます。
$ sudo ll /etc/letsencrypt/live/
// ドメイン別でdirが出来る
drwxr-xr-x 2 root root 4096 Sep 25 2017 hoge.com
drwxr-xr-x 2 root root 4096 Sep 25 2017 foo.com
// 中身はシンボリックリンクが貼られている
$ sudo ll /etc/letsencrypt/live/
lrwxrwxrwx 1 root root 36 Sep 25 2017 cert.pem -> ../../archive/hoge.com/cert1.pem
lrwxrwxrwx 1 root root 37 Sep 25 2017 chain.pem -> ../../archive/hoge.com/chain1.pem
lrwxrwxrwx 1 root root 41 Sep 25 2017 fullchain.pem -> ../../archive/hoge.com/fullchain1.pem
lrwxrwxrwx 1 root root 39 Sep 25 2017 privkey.pem -> ../../archive/hoge.com/privkey1.pem
今回はapacheで利用するので、これらの発行された証明書をapacheに読み込ませていきましょう。
<VirtualHost *:443>
ServerAdmin hoge@hoge.com
ServerName hoge.com
DocumentRoot /var/www/hoge
# ここはお好みで
<Directory /var/www/hoge>
# .htaccessの許可
AllowOverride All
</Directory>
# logを吐く場所
ErrorLog /var/log/httpd/hoge_ssl_error.log
CustomLog /var/log/httpd/hoge_ssl_access.log combined
# SSLを設定し、証明書を読み込ませる
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/hoge.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/hoge.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/hoge.com/fullchain.pem
</VirtualHost>
confの設定が終わったら、apacheをgracefulしましょう。
$ sudo service httpd graceful
3.証明書自動更新の設定
Let'sEncryptは無料でとても良いサービスなのですが、証明書の有効期限が90日で切れてしまいます。
ただ、証明書の更新を行えばその期限は持続されるので、最後にその自動化を行っていきます。
自動化は簡単でcronを使えばOKです。
// 毎月1日の午前4時に自動更新をするcron登録
// certbot-auto で証明書を更新し、apacheを再起動
$ sudo crontab -e
00 04 01 * * /usr/bin/certbot-auto renew --force-renew && service httpd graceful
4.豆知識まとめ
4-1..htaccessによるHTTP→HTTPSへのリダイレクト
SSL設定が終わった後によくやるやつです。
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
4-2.IP制限を行っている場合の対応
Let's Encryptでは更新時に外部からのアクセスが発生するため、apache等でIPアドレスによるアクセス制限を行っていたりすると、更新に失敗することがあります。
その制限を解除するためには、以下の設定をapache.confに追記します。
※今回はapacheでアクセス制限をしているとします。
<Directory "/var/www/hoge/.well-known">
<RequireAll>
Require all granted
</RequireAll>
</Directory>
5.インストールシェルをつくりました
※rootユーザーで叩いてください!
#!/bin/sh
#-------------------------------------
echo "パスの通っている場所を入力してください (ex. /usr/bin)"
read INSTALL_PATH
#-------------------------------------
#-------------------------------------
echo "RootDirectoryを入力してください (ex. /var/www/hoge)"
read WEBROOT
#-------------------------------------
#-------------------------------------
echo "対象ドメインを入力してください (ex. hoge.com)"
read DOMAIN
#-------------------------------------
#-------------------------------------
echo "管理用メールアドレスを入力してください (ex. hoge@hoge.com)"
read EMAIL
#-------------------------------------
# certbotが未インストール時のみインストール
if ! type certbot-auto > /dev/null 2>&1; then
sudo curl https://dl.eff.org/certbot-auto -o $INSTALL_PATH/certbot-auto
fi
# 権限付与
sudo chmod 700 $INSTALL_PATH/certbot-auto
# 証明書発行
sudo certbot-auto certonly --webroot -w $WEBROOT -d $DOMAIN --email $EMAIL