背景

世界ではWebサービスのセキュリティ向上のため、これまでの平文HTTPから暗号化通信HTTPSへの移行「常時SSL/TLS」が進んでいます。
HTTPSしていないWebサイトでは、かなりの数のハッキングがされており、悪用されている恐れがあるのが背景です。
Google検索でもHTTPSされたサイトの検索順位を上位にランクする方針で、SEO対策的にもメリットがあります。
また一般の利用者もHTTPSを標準で利用する様にWebブラウザにて対応が進行しています。
特にGoogleのChromeは2017年から警告表示を開始しています。

グーグル、「Chrome 56」でHTTP接続への警告表示を開始

グーグル、HTTPページへの警告表示を強化へ–10月リリース予定の「Chrome 62」から

テキストボックスにてフォーム入力する際にはHTTPSでないとユーザーに警告される事になり、
金融やショピングなどのWebサイト以外でも今後「常時SSL/TLS」が求められて来る事でしょう。

Let’s Encryptとは?

無料でオープンな証明書を発行できるサービスです。手続き不要で、サーバーとドメインさえ持っていれば即時発行可能です。(Chromeでも緑の鍵マークになります)

従来は認証局に費用を払って購入していたSSL/TLS証明書ですが、DVに関しては無償で取得できる認証局があります。

Let’s Encrypt

2016年4月に正式サービスが開始されて商用利用も可能です。必要なのは申請する管理ドメインと連絡先メールアドレスだけです。

導入手順

さっそく導入してみましょう。
環境は AmazonLinux + Apache2.4 です。(バージョン違いは適宜読み替えてください)
前提として上記は導入済みとします。まだの方はAWSのページなどを参考にインストールまで済ませてください。

1. AWSのセキュリティグループを設定する

セキュリティグループのインバウンドのHTTPS(433)を許可(0.0.0.0/0)にします。これをやらないと証明書を自動取得する際にエラーになります。

2. certbotインストール

対象のインスタンスにSSHでログインし、以下を実行します。(rootじゃなければsudoつける)
権限も変更しておきましょう。
Let’s EncryptではSSL/TLS証明書を取得するツールとしてcertbotを推奨しています。

certbot

# curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
# chmod 700 /usr/bin/certbot-auto

3. 証明書の発行

cerbotのインストールが成功したら以下のコマンドで自動生成します。

# certbot-auto certonly --webroot -w /var/www/html -d test.example.com --email hoge@example.com --debug
オプション 説明
certonly 証明書の作成
–webroot ウェブサーバーモードを指定
-w /var/www/html ドキュメントルートのパス(自環境に合わせてください)
-d test.example.com 認証対象のドメイン名(ここでは例として左記)
–email hoge@example.com 連絡用のメールアドレス(ここも例として左記)
–debug Amazon Linuxはまだ実験的だそうでこのオプションつけないと実行できませんのでご注意。

certbotのコマンドだけでSSL/TLS証明書が取得できますが、自動設定よりオプション指定による取得を推奨しておきます。以下のサイトにてオプションのガイドが日本語で解説されています。

Let’s Encrypt 総合ポータル

4. ライセンス承諾

次にライセンス承諾を求められます。

-------------------------------------------------------------------------------
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:Agree

5. 成功確認

連絡先のメールアドレス宛にLet’s Encryptの認証確認メールが届きます。メール文中のリンクをクリックしてLet’s Encryptのサイトに行くと無事に承認されます。これでSSL/TLS証明書の発行準備が出来ましたので実行します。

-------------------------------------------------------------------------------
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: Yes
Starting new HTTPS connection (1): supporters.eff.org
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for test.example.com
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/test.example.com/fullchain.pem. Your cert
will expire on 2017-07-30. To obtain a new or tweaked version of
this certificate in the future, simply run certbot again. To
non-interactively renew *all* of your certificates, run ”certbot
renew”

6. 生成された証明書の確認

しばらくすると以下のディレクトリに証明書が生成されます。申請したドメイン名とドキュメントルート、有効期限が表示されて無事にSSL/TLS証明書が取得出来ました。取得したSSL/TLS証明書は以下の場所にあります。

/etc/letsencrypt/live/test.example.com/
cert.pem
privkey.pem
chain.pem

7. mod_sslインストール

Apacheにmod_sslを未インストールならインストールします。

# yum install -y mod24_ssl

参考元

8. ssl.confに証明書パス設定

/etc/httpd/conf.d/ssl.confに先ほど取得した証明書のパスを設定します。

...
SSLCertificateFile /etc/letsencrypt/live/test.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/test.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/test.example.com/chain.pem
...

9. Apache再起動

Apacheを再起動すれば反映完了!ブラウザでhttps://~ で確認してみてください!

$ sudo service httpd restart

10. その他

上記の後に、http→httpsの強制リダイレクトや、証明書の自動更新設定などやっておいたほうがよいと思います。

WebサービスにHTTPにて接続を確認してみましょう。HTTPSにリダイレクトされたら、「常時SSL/TLS」する事が出来ます。

SSL/TLS証明書の更新

Let’s Encryptで取得したSSL/TLS証明書の有効期限は「3ヶ月」です。
cronで定期実行する事で更新します。
また更新間際でないと実際には更新が実行されない為、cronの定期実行は毎週行うことで漏れを防ぎます。

$ sudo crontab -e
30 2 * * 0 /bin/certbot renew --pre-hook ”service httpd restart”

毎週日曜日AM2:30に実行し、Apacheを再起動する。

終わりに

今まで証明書と言えばお金(最近は、1年1000円台もありますが)を払い、ドメイン承認などでとても時間がかかるイメージでしたが、非常に簡単にSSL化出来たので、ぜひみなさんもお試しください!