Edited at

無料でHTTPS化できる「Let's Encrypt」をやってみた ※install.sh付き

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をインストールします。


certbot.sh

// 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.sh

$ 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に読み込ませていきましょう。


httpd.conf

<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ユーザーで叩いてください!


install.sh

#!/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



参考文献