無料でHTTPS化できる「Let's Encrypt」をやってみた(インストールシェル付き)

  • 16
    いいね
  • 0
    コメント

この10月からGoogleが全てのHTTPページに警告を出すことになりました。
それに伴い、今後はサイトがHTTPSとなっているかどうかも、SEOに影響を及ぼすことになってしまったのです。
(恐ろしいですね…)

そこで今回は、無料でSSL証明書を発行することが出来るLet's Encryptを使って、サイトをHTTPSにする方法を書いてみました。
インストール用のシェルも最後に載せてあるので、よかったらそれもご利用ください。

実行環境

  • CentOS6
  • apache2.2

Let's encryptとは?

今まで、サイトをSSL化するためには、1年単位でライセンスを購入し、その証明書を用いる必要がありました。

こいつがピンきりですが高いものはめちゃくちゃ高くて、年間数千円~十数万円の費用がかかるのが普通でした。

そこで、「インターネットを介した安全な通信を行う際の、経済面・技術面・教育面での障壁を減らすこと」を指名として活動している、非営利団体のISRG(Internet Security Research Group)が開発したのが、このLet's Encryptなのです。

これを使えば無料かつ、面倒な更新手続き・運用を自動化しながら、安全な通信を行うことが出来るようになります。

証明書を発行しよう!

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

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:

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

apache.conf
<VirtualHost *:443>
    ServerAdmin hoge@hoge.com
    ServerName encrypt.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/encrypt.hoge.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/encrypt.hoge.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/encrypt.hoge.com/fullchain.pem
</VirtualHost>

confの設定が終わったら、apacheをgracefulしましょう。

$ sudo service httpd graceful

証明書自動更新の設定

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

豆知識まとめ

.htaccessによるHTTP→HTTPSへのリダイレクト

SSL設定が終わった後によくやるやつです。

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

IP制限を行っている場合の対策

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

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

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

めんどくさいので、インストールだけをまとめてみました

※rootユーザーで叩いてください!

letsencrypt.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

参考文献