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

```shell-session: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コマンドを叩いていきます。

```shell-session: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 <メール>@<アドレス>     // メールアドレス登録 (証明書期限切れの通知用)
```

下記のようなメッセージが出たら、無事、発行完了です。

```message
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 に置かれます。

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

```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です。

```shell-session
// 毎月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設定が終わった後によくやるやつです。

```.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
```

## 4-2．IP制限を行っている場合の対応
Let's Encryptでは更新時に外部からのアクセスが発生するため、apache等でIPアドレスによるアクセス制限を行っていたりすると、更新に失敗することがあります。

その制限を解除するためには、以下の設定をapache.confに追記します。
※今回はapacheでアクセス制限をしているとします。

```apache
<Directory "/var/www/hoge/.well-known">
    <RequireAll>
        Require all granted
    </RequireAll>
</Directory>
```


# 5．インストールシェルをつくりました
※rootユーザーで叩いてください！

```bash: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
```

# 参考文献
- [Let's Encrypt 総合ポータル](https://letsencrypt.jp/)
- [グーグル、HTTPページへの警告表示を強化へ--10月リリース予定の「Chrome 62」から](https://japan.cnet.com/article/35100589/)
- [Let’s EncryptのSSL証明書で、安全なウェブサイトを公開](http://knowledge.sakura.ad.jp/knowledge/5573/)