初心者がVPS(Virtual Private Server)をWebサーバーとして構築し、WordPressのサイトを運用できるようになるまでの「ネコでもわかる!」連載の第6回目です。

最初から読みたい方はこちらからどうぞ。

前回(第5回目)は「phpMyAdminを導入しよう」というテーマで、MariaDBをブラウザから簡単に操作できるphpMyAdminのインストールの手順を説明しました。

今回はSSL証明書 Let’s Encryptの導入方法について説明します。
対象サーバーは、さくらのVPS CentOS7 x86_64です。

2. SSL証明書 Let’s Encryptをインストールする

httpサーバーであるApacheをすでにインストールしているので、http通信(非暗号化通信)でのWebサイトの公開の準備はすでにできあがっています。
しかし、最近はクレジットカード情報の入力や個人情報の入力フォームだけでなく、サイトのすべてのページを暗号化通信で公開する常時SSLが普及しはじめており、すでにYahooやGoogleでもサイト全体がSSL化されています。
SEOの観点からも常時SSLが有利であり、時代の潮流としても今後は常時SSLがあたりまえになりますので、本記事でも常時SSLでのサイト公開を目指したいと思います。

インターネットに公開するWebサイトをSSL化するには、SSL証明書(正確には「SSL/TLSサーバー証明書」と言います)が必要です。
一般的には、ジオトラストやグローバルサインなどの認証局が発行する有料の証明書を購入してサーバーにインストールします。
しかし無料のSSL証明書発行サービスであるLet’s Encryptの正式サービスが2016年4月に開始されました。
これにより、誰でも無料でSSL証明書を手に入れることができるようになりました。導入も比較的簡単ですので、ここではその手順を説明します。

 

ただし、Let’s Encryptには以下の制限があります。

  1. 123.123.123.123といったIPアドレス指定でアクセスする場合のSSLには対応していないので、example.comといった独自ドメインをあらかじめ取得・設定しておく必要があります。
    ※ドメインの取得・設定に関しては第3回目の記事の「ドメインを取得して、DNSの設定をする」を参照してください。
  2. SSL証明書の有効期限は3ヶ月なので、3ヶ月ごとに更新する必要があります
  3. 対応しているのは「ドメイン認証(DV)証明書」のみで、中規模以上の企業でよく使われる「企業認証(OV)証明書」や「EV証明書」は取得できません。

SSL証明書について詳しい記事がさくらのナレッジに掲載されていますので、あわせて読んでいただくとよいと思います。
改めて知ろう、SSLサーバー証明書とは? – さくらのナレッジ

また、Let’s Encryptとは何か?について詳しく知りたい方はこちらの記事が参考になります。
Let’s EncryptのSSL証明書で、安全なウェブサイトを公開 – さくらのナレッジ

サイトをSSL化するには、ApacheのSSLモジュールmod_sslが必要です。
前回(第5回)の記事中、phpMyAdminインストールの手順でmod_sslをインストールしましたが、まだの方はインストールしてください。

mod_sslが導入済みかどうかは以下のコマンドで確認できます。(rootユーザーで操作してください)

# httpd -M
・・・・
ssl_module (shared)
・・・

このようにssl_moduleが一覧に表示されていれば導入済みです。

また、SSLを使用可能にするにはhttp通信の80番ポートではなく、https用の443番ポートがファイアウォールを通過できていなければなりません。
これは第3回目の記事ですでに許可設定にしてありますが、もしまだの方はhttpsのポート開放設定を行ってください。

https通信がファイアウォールで許可されているかどうかは以下のコマンドで確認できます。

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client http https ssh
  ports:
  ・・・

上記のようにservicesの項にhttpsがあればOKです。

ではいよいよLet’s Encryptのインストールです。

# 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): (EMAILアドレスを入力。Let's Encryptからのお知らせを受け取るアドレスになります。)

Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org

-------------------------------------------------------------------------------
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: Y (Let's EncryptパートナーにEmailを公開します。したくない場合はNに。)

Starting new HTTPS connection (1): supporters.eff.org
Obtaining a new certificate
Performing the following challenges:
tls-sni-01 challenge for xxxxxxx.com

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を選択)
Deploying Certificate for example.com to VirtualHost /etc/httpd/conf.d/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にリダイレクトします)

Created redirect file: le-redirect-example.com.conf
Rollback checkpoint is empty (no changes made?)

-------------------------------------------------------------------------------
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 2017-09-18. 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

ここまできたらhttpdを再起動します。

# systemctl restart httpd

以上でLet’s EncryptによるSSL証明書が導入され、SSLが使えるようになりました。

https://example.com(あなたのドメイン)
にアクセスしてみてください。アドレスバーのところに鍵のマークが表示されているでしょうか?

例えば、YahooのURLはfirefoxでこのように表示されます。

YahooのSSL証明書確認

自分のドメインのURLで詳細を見てみると、Let’s Encryptで認証されたSSLであることが分かります。

Let' Encriptで生成されたSSL証明書

Let’s Encryptのインストール方法などはこちらを参考にしました。
How to Secure Apache with Let’s Encrypt on CentOS 7 | DigitalOcean(英語)

また、日本語のLet’s Encryptの総合的な情報はこちらが参考になります。
https://letsencrypt.jp/

Let’s Encrypt SSL証明書の更新

これでSSL証明書が使えるようになったわけですが、先述したとおり証明書の有効期限は三ヶ月です。
期限がやってくる前に、更新作業を忘れず行いましょう。
rootユーザーで以下のコマンドを実行すると更新できます。
(ただし、証明書の有効期限の残りが30日未満の場合のみ更新されます。それ以上の期限が残っている場合は更新されません。)

# certbot renew

もし、有効期限までの残り日数に関係なく、すぐに証明書を更新したい場合は、 –force-renew オプションを使います。

# certbot renew --force-renew

「証明書の更新の方法は分かった。でも定期的に手でコマンドを打って更新するなんてめんどくさいよ!」ていう方は、cronによるスケジュール実行のしくみを導入して楽になりましょう。
cronの設定についての詳細は割愛しますが、例えば毎日午前3時にcertbotコマンドを実行するにはcronを以下のように設定します。
これは毎日実行されるスケジュールになりますが、SSL証明書の有効期限まで日数がある(30日以上)場合は更新されず、有効期限が30日を切った日に自動的に証明書が更新されます。

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

cronについての詳しい情報については以下を御覧ください。
◇プログラムを予約して実行する◇初心者のためのLinuxサーバー構築講座

ここまでで、SSL証明書がインストールできました。
次回(第7回目)の記事の公開まで自分のサーバーを触る予定が無い方は、前回と同様、外部からの余計な攻撃にさらされないようにサーバーを停止しておきましょう。
サーバー停止コマンドは以下です。

# shutdown -h now

第6回目は以上です。第7回目をお楽しみに。

(イラスト:小川真孝(ブログ))