Let's Encryptを使って無料でHTTPS通信をできるようにした【ワイルドカード対応】


VPSサーバーでサイトを構築してみたのでHTTPS(SSL)通信をするのにSSL証明書を設置しました。
AWSでないのでACMも使えないし、オレオレ証明書だと最近のブラウザは警告を出すようになってしまったので、Let’s EncryptというサービスでSSL証明書を【無料で】発行して設置しました。

はじめに

HTTPS通信は、HTTPにS(Secure)が付いているということでセキュリティ的に安全なHTTP通信です。
HTTPSで通信するとSSL/TLSプロトコルを利用した暗号化通信が行われ通信内容が他人から見えなくなります。(逆にHTTPだと見えちゃう)
WEBサービスのアカウントやパスワード、クレジットカード情報など重要な情報を扱うページは勿論のこと、昨今では常時SSL通信というのが当たり前になってきています。
最近のブラウザではSSL通信でないページには「保護されていない通信」というメッセージが出るようになりました。

で、そのSSL通信をするのにはSSL証明書が必要です。
一般的には認証局が有料で発行する証明書を購入してサーバーにインストールしますが、無料のSSL証明書発行サービスであるLet’s Encryptを使うことにより、誰でも無料でSSL証明書を手に入れることができるようになりました。
今回はさらに『ワイルドカード証明書』という、同じドメインだといくらでも使える便利な証明書を発行します。

※ワイルドカード証明書
一般的な証明書を使用すると、通常は1つのサブドメインに対して1つの証明書が必要なのですが、ワイルドカード証明書を使用すると同じドメインであればいくらでも使用できるという便利な証明書です。

環境

今回はCentOS7.5にインストールしました。

手順

それではLet's Encryptを使ってSSL通信に対応していきます。

ApacheにSSLモジュールmod_sslをインストールする

まずは、firewallでSSL通信を許可しましょう。
1行目のコマンドを打って”success”と表示されていれば成功です、firewallを再起動して設定を反映させましょう。

# firewall-cmd --add-service=https --zone=public --permanent
# systemctl restart firewalld

次にyumコマンドでmod_sslをインストールします。
設定変更を有効にするために、httpdを再起動します。

# yum install mod_ssl
# systemctl restart httpd

まずはこれでSSL通信が可能になりました。
自分のサイトにhttp://example.com ではなくて、https://example.com でアクセスしてみてください。
これでSSL通信はできているのですが、おそらくブラウザで『安全な接続ではありません』というエラーがでると思います。
これは現在は自分自身でセキュアを証明している状態だからです、セキュアな通信はできていますが要は『俺を信じろ、俺に相談してみ、誰にも言わないし』みたいな状態です。
なので自分で使う場合は良いのですが、WEBのパブリックな場所でこの状態では信用してもらえません。
そこで信頼のおける第三者に証明書を発行してもらうわけです、『この人は信頼できる人なので相談しても大丈夫ですよ、他人に話したりしません』と認証してくれるわけですね。

認証局は信頼を売りにしているので、発行する相手を審査したりなどコストが掛かるわけで、一般的には有料です。
その中で、Let’s Encryptは無料で証明書を発行できるということで注目を浴びています。
無料だと心配されるかもしれませんが、Let’s EncryptはSSL/TLS の普及を目的に設立された非営利団体です。
その目的に賛同した企業がスポンサーとなり運営しているので無料で利用できるのです。
それらの賛同した企業たちが有名企業が多い為、「無料」だとしても不安に思う必要はないと思います。

Let’s Encryptをインストールする

それではLet’s Encryptをインストールしていきましょう。
まずはcertbotコマンドをインストールします。

# yum install certbot python2-certbot-apache

インストールしたcertbotコマンドを使用してインストールします。
example.comの部分は自身のサイトのドメインに変更してください。

# certbot --apache -d example.com

そうするといくつかの質問があるので答えます。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):

お知らせを受け取るアドレスを入力します。

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at
https://acme-v01.api.letsencrypt.org/directory
-------------------------------------------------------------------------------
(A)gree/(C)ancel:

Aを選択して、規約に同意します。

-------------------------------------------------------------------------------
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about EFF and
our work to encrypt the web, protect its users and defend digital rights.
-------------------------------------------------------------------------------
(Y)es/(N)o:

Let's EncryptパートナーにEmailを公開するかどうかの様です。
問題なければYで、したくなければNを選択します。

We were unable to find a vhost with a ServerName or Address of example.com.
Which virtual host would you like to choose?
(note: conf files with multiple vhosts are not yet supported)
-------------------------------------------------------------------------------
1: ssl.conf                       |                       | HTTPS | Enabled
-------------------------------------------------------------------------------
Press 1 [enter] to confirm the selection (press 'c' to cancel):

1 を選択して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):

2を選択してHTTPでのアクセスはHTTPSにリダイレクトするようにします。
そして以下の表示がされたらインストール成功です。

-------------------------------------------------------------------------------
Congratulations! You have successfully enabled https://example.com

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

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will
   expire on 2018-09-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"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - 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

httpsを再起動して設定を反映させましょう。

# systemctl restart httpd

これでSSL証明書のインストールが完了し、正規にSSL通信が可能になりました。
https://example.com でエラー無くアクセスできるようになったはずです。

ワイルドカードで使えるようにする

次にワイルドカードで使用できるSSL証明書を発行します。
ワイルドカードに対応するすと例えば、https://example.comでもhttps://www.example.comでもドメインが同じであれば共通で使えるようになります。
先ほど作成した証明書はhttps://example.comでしか使用できないのでhttps://www.example.com用は別途作成しなければなりませんでした。

では、早速ですが以下のコマンドでワイルドカード証明書をは行します。
example.comの部分はご自身のサイトのURLに置き換えてください。

# certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -d example.com \
    -d *.example.com

基本的には先ほどと同じ質問がされるので回答していきます。
最後にそのドメインの持ち主かを証明する質問が出てきます。

-------------------------------------------------------------------------------
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

fjdklajfdklfjkdalfghjkajklfa-sXXfdafgxxxXXxgdaxlJI  // ここはそれぞれ発行されます。

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

この表示されている文字列をドメインを管理しているDNSに_acme-challenge.example.com の TXTレコードとして登録します。
DNSへの登録方法はご利用の環境によって使用方法が違うので割愛しますが、一般的にはレンタルしたサーバーにパネルにあります。

DNSに追加したら、以下のコマンドを入力してDNSに反映されたことを確認します。
結果に設定したレコードが表示されればOKです。

※別のコンソールから対応してください。

# dig -t TXT @{ネームサーバーのFQDN} _acme-challenge.example.com

反映されたら、もとの画面でEnterするとインストールが成功となります。
これで、https://www.example.comもSSL通信が使用できます。

SSL証明書の更新を自動でする

SSL証明書には期限というのがあります、1度発行した証明書は永久的に使えるわけではありません。
一般的には1年か2年です。
それに比べるとLet's Encryptは証明書の期限が短く3か月です。
そこで自動で更新するように設定します。

まずは以下が証明書を自動で更新するコマンドです。
これを毎日1回自動で動かすことで常に最新に保つわけです。

# certbot renew

自動化にはcrontabというスケジューラを利用します。
以下のコマンドを打つと設定ファイルが開きます。

# crontab -u root -e

そこに以下の様に設定を追加してください。
以下の設定だと毎朝4時に更新をかけるということになります。

0 4 *  *  * root /usr/bin/certbot renew

これで、Let's Encryptを使用してのSSL通信が可能になりました。
初めての投稿で緊張いたしました