無料SSL証明書「Let’s Encrypt」でサイトを HTTPS に対応する(Apache編)

無料SSL証明書「Let’s Encrypt」とは

Let’s Encrypt(レッツ・エンクリプト)は、誰でも自由に使えてオープンな仕様を目指している非営利団体ISRG (Internet Security Research Group) が提供している無料SSL証明書サービスです。
証明書の発行・インストール・更新のプロセスを自動化することでコストを抑え、無料で利用することができるそうです。ありがとうございます!
なお、SSL証明書の有効期限は3ヶ月しかありません。しかし、更新し続けることでずっと利用可能です。(やり方は後述)

Certbot クライアント

Let’s Encrypt の証明書の発行と設置、および更新を自動で行ってくれるプログラムである Certbot クライアントのインストールが必要です。
これ以降は、SSL化したいWEBサーバー上での操作説明になります。

EPELリポジトリ の導入

まずは、EPELリポジトリを利用できるように設定します。(EPEL: Extra Packages for Enterprise Linux)
(すでにEPELリポジトリを導入済みの場合はスキップしてください)

% sudo yum install epel-release

Certbot クライアントのインストール

次に、Certbot クライアントをインストールします。

% sudo yum install certbot python-certbot-apache

CentOS 6 では、上記のコマンドではインストールできないため、下記にて対応

% cd ~/sysad
% wget --no-check-certificate https://dl.eff.org/certbot-auto
% chmod a+x certbot-auto

certbot-auto コマンドで対話形式にてセットアップ

% ./certbot-auto
% certbot-auto
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): YOUR_EMAIL@example.com
Please read the Terms of Service at
 :
(A)gree/(C)ancel: A
Would you be willing to share your email address with the Electronic Frontier
 :
(Y)es/(N)o: N
Which names would you like to activate HTTPS for?
 :
blank to select all options shown (Enter 'c' to cancel): <HTTPSに対応したいドメインの番号。複数の場合はカンマまたはスペース区切りで列挙>
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
 :
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1
 :

筆者の環境では、以下のパスに SSL 用の conf ファイルが生成されました。

/etc/httpd/conf/vhosts/<DOMAIN>-le-ssl.conf

また、下記に証明書と鍵、および関連ファイル一式が生成されました。

/etc/letsencrypt

バーチャルホストの設定

前項の conf ファイルを元にバーチャルホストの設定を行います。
具体的には以下のようになりました。

<FQDN.DOMAIN>.conf

<VirtualHost *:80>
    ServerName <FQDN.DOMAIN>
    # force redirect https
    RewriteEngine on
    RewriteCond %{HTTPS} !=on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,QSA,L]
</VirtualHost>

<VirtualHost *:443>
    ServerName <FQDN.DOMAIN>
    DocumentRoot /path/to/www/public_html

    ErrorLog  logs/<FQDN.DOMAIN>.error_log
    CustomLog logs/<FQDN.DOMAIN>.access_log combined

    <Directory "/path/to/www/public_html">
        AllowOverride All
        Order Deny,Allow
        Allow from All
        DirectoryIndex index.php index.html index.htm
        Options -Indexes Includes FollowSymLinks MultiViews
    </Directory>

    SSLCertificateFile /etc/letsencrypt/live/<FQDN.DOMAIN>/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/<FQDN.DOMAIN>/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateChainFile /etc/letsencrypt/live/<FQDN.DOMAIN>/chain.pem

</VirtualHost>

設定を反映させるため、Apache をリロードします。

%  sudo /etc/init.d/httpd reload  

SSL化されたか確認

ブラウザで「https://<FQDN.DOMAIN>」にアクセスして、問題ないか確認します。
このとき、SSLの有効期限がいつまでかも確認しておくとよいでしょう。

CRON による証明書の自動更新

先にも書きましたが、Let's Encrypt の無料SSL証明書の有効期限は3ヶ月しかありません。
しかし、更新を繰り返すことでずっと使い続けることができます。
更新は CRON で定期的かつ自動で行うことをオススメします。

SSL証明書を更新するにあたり、certbot-auto コマンドが必要なので、/usr/bin 配下に設置します。
wget でダウンロードしたディレクトリに移動して、certbot-auto コマンドを mv します。

% ls -1
certbot-auto*
% sudo mv certbot-auto /usr/bin/certbot-auto
% sudo chmod 700 /usr/bin/certbot-auto
% which certbot-auto
/usr/bin/certbot-auto

CRON の設定

certbot-auto コマンドが /usr/bin 配下に設置されたことを確認し、下記のように CRON を設置します。
なお、この記述はWEBサーバーが「Apache」の場合の設定です。(Nginx の場合は記述が異なります)

/etc/cron.d/letsencrypt.cron

MAILTO="<YOUR_EMAIL@example.com>"
50 4 * * 0 root /usr/bin/certbot-auto renew --post-hook "/sbin/service httpd reload" > /dev/null

--dry-run オプション

「–dry-run」オプションにより、更新処理をシミュレーションできます。
CRON を設置する前に一度は実行することをおすすめします。

% sudo /usr/bin/certbot-auto renew --dry-run

 :
Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/<FQDN.DOMAIN>/fullchain.pem (success)
 :

(おまけ)SSL証明書有効期限の確認

% sudo openssl x509 -in /etc/letsencrypt/live/<FQDN.DOMAIN>/cert.pem -noout -dates
notBefore=<開始日時(GMT)>
notAfter=<終了日時(GMT)>

関連エントリー: