(簡単)VPS(CentOS7 Apache4.6)にLet’s Encryptを導入

Attention : certbot のコマンドはこの記事を書いた時よりかなりシンプルになっています。
https://certbot.eff.org/


表題の通りなんですけれど、非常に簡単で驚くほどです。
今回導入したサーバーには20サイトぐらいあるのですが、次々にHTTPS化できました。
サーバーを独自に立ててウェブサイトを運用している方は、ぜひ導入すべきだと思います。

一般的な使い方

以下のページにて、一般的な使い方が説明されています。
Let’s Encrypt 総合ポータル Let’s Encrypt の使い方

certbotという公式のツールを使った、簡単にSSL証明書をインストールする方法が説明されています。

CentOS7 Apache2.4では

まだApacheにSSLモジュールをインストールしていない方は、以下のコマンドでインストールし、Apacheを再起動してください。

# yum install openssl
# yum install mod_ssl
# systemctl reload httpd

SSLの設定ができていないと、途中で以下のようなエラーが出ます。

Failed to connect to 114.179.231.41:443 for TLS-SNI-01 challenge

一般的な使い方を踏まえて、CentOS7でどうすればいいかは、以下のサイトに詳しいです。
CentOS7でLet’s Encryptを使う

CentOSでは、yumでcertbotをインストールすることができます。
以下のコマンドを打つだけです。

sudo certbot run --apache -d host1.sample.com

(※host1.sample.comは実際のホスト名に変更してください)
しかしいきなりやると、

Detail: DNS problem: NXDOMAIN looking up A for host1.sample.com

と怒られてしまう場合があります。

証明書を生成するために、指定したドメイン名からIPアドレスを逆引きし、インストールしようとしているサーバーとドメインの所有者であることが承認される必要があります。
要するに、DNSで名前解決できている必要があります。

仮URLの場合には

サイトのリニューアルなどで仮URLで構築する場合は注意が必要です。
仮URLの状態でもHTTPSが必要な場合は、仮URLで取得しましょう。
本番切替でドメイン名が変わる際には、

1.HTTPのVirtualHostを変更
2.DNSを切替
3.DNSが切り替わったらcertbotで証明書を取得/設定反映

という手順が必要になります。
DNSを切り替えてから反映されるのにどの程度の時間が必要か予測が難しいため、certbotを実行するまでの間はHTTPでのサイト閲覧になるため、HTTPでも問題なくアクセス可能(リンクをHTTPSから記述しない、.htaccessなどでのHTTPSへのリダイレクトはHTTPS設定反映後に行う、など)にしておく必要があるでしょう。

ここで名前解決し(たぶん、ちゃんとDNSで)、上記のコマンドを実行すると、証明書の取得と設定ファイルへの書き込みが始まります。

# certbot run –apache -d host1.sample.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for host1.sample.com
EnableSendfile on
Waiting for verification…
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0006_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0006_csr-certbot.pem
Created an SSL vhost at /etc/httpd/conf.d/host1.sample.com-le-ssl.conf
Deploying Certificate to VirtualHost /etc/httpd/conf.d/host1.sample.com-le-ssl.conf

Please choose whether HTTPS access is required or optional.
——————————————————————————-
1: Easy – Allow both HTTP and HTTPS access to these sites
2: Secure – Make all requests redirect to secure HTTPS access
——————————————————————————-
Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel):

途中で、HTTPとHTTPSの両方でのアクセスを許可するか、それともHTTPSでのアクセスを強制するのかを聞かれます。
今回のサイトでは、その設定は.htaccessでやるので1を選びました。
状況に合わせてお選びください。

Select the appropriate number [1-2] then [enter] (press ‘c’ to cancel): 1

——————————————————————————-
Congratulations! You have successfully enabled https://host1.sample.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=host1.sample.com
——————————————————————————-

IMPORTANT NOTES:
– Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/host1.sample.com/fullchain.pem. Your cert
will expire on 2017-07-27. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again with the
“certonly” option. To non-interactively renew *all* of your
certificates, run “certbot renew”
– If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let’s Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

「Congratulations! You have successfully enabled https://host1.sample.com」と表示されていますね。
成功です

ログにもあるとおり、「/etc/httpd/conf.d/host1.sample.com-le-ssl.conf」というVirtualHostの設定ファイルが作成されていますが、基本的な内容はHTTPの設定のコピーです。
以下は作成された設定ファイルからの抜粋です。
証明書に関する記述が追記されています。



・・・・
SSLCertificateFile /etc/letsencrypt/live/host1.sample.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/host1.sample.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateChainFile /etc/letsencrypt/live/host1.sample.com/chain.pem
・・・・

以下のコマンドでapacheの設定をリロードするか、再起動すれば設定が反映してhttpsでアクセス可能になります。

sudo systemctl reload httpd

私の場合、SSLのバーチャルホストの設定でミスっていたため、ssl.confに該当ドメインのバーチャルホストがないなど怒られたりもしました。
しかし、それを再現しようと同じホストに紐づけられているがバーチャルホスト設定されていない別ドメインでコマンドを実行すると、すでに設定済みのバーチャルホストに別ドメインの証明書設定を書き込むという事態が発生し、ほんとにServerNameを見ているのかどうかは不明です。
ちゃんと事前に追加したいドメイン名のバーチャルホストが設定してあれば、うまくいくのかもしれませんけれど。

手抜きしないで、ちゃんとVirtualHostごとに設定ファイルを分ければ問題ありません。また、certbotの動作が大きく変わっていたのでリライトしました(2017/04/27追記)