背景
世界では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に関しては無償で取得できる認証局があります。
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を推奨しています。
# 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証明書が取得できますが、自動設定よりオプション指定による取得を推奨しておきます。以下のサイトにてオプションのガイドが日本語で解説されています。
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化出来たので、ぜひみなさんもお試しください!