K4750.NET

無料SSLサーバ証明書「Let’s Encrypt」導入

証明書

当サイトではSSL通信のために、過去に作成した「オレオレ証明書」を使用してきたが、無料SSLサーバ証明書「Let’s Encrypt」の登場に伴い、第三者機関に証明されているマトモ(?)な証明書へ移行することにしたので、WordPressの設定変更等を含め、その手順をざっくりとご紹介。

なお、以下は当サイトの環境Ubuntu 14.04 LTS+Apache2.4.7向けの手順であることにご注意。


1.参考

より正確かつ詳細な手順は、以下本家サイトまたは総合ポータルサイト(日本語)を参照。


2.インストール

GitHubからLet’s Encryptクライアントのソースコードを取得し、まずはletsencrypt-autoコマンドを--helpオプション付きで実行する(sudo可能なユーザである必要)。

$ git clone https://github.com/letsencrypt/letsencrypt
$ cd letsencrypt
$ ./letsencrypt-auto --help

不足するパッケージ等があれば、上記タイミングで自動的にインストールされる(このタイミングではまだ証明書は作成されない)。


3.SSL/TLSサーバ証明書作成

続けて以下を実行。

$ sudo service apache2 stop
$ ./letsencrypt-auto certonly -a standalone -d www.k4750.net
$ sudo service apache2 start

証明書発行のために一時的にポート80を使用するそうなので、一時的にApacheを停止している。/etc配下を覗いてみると、

# ls -l /etc/letsencrypt/live/www.k4750.net/
total 0
lrwxrwxrwx 1 root root 37 Mar 12 20:56 cert.pem -> ../../archive/www.k4750.net/cert1.pem
lrwxrwxrwx 1 root root 38 Mar 12 20:56 chain.pem -> ../../archive/www.k4750.net/chain1.pem
lrwxrwxrwx 1 root root 42 Mar 12 20:56 fullchain.pem -> ../../archive/www.k4750.net/fullchain1.pem
lrwxrwxrwx 1 root root 40 Mar 12 20:56 privkey.pem -> ../../archive/www.k4750.net/privkey1.pem
# ls -l /etc/letsencrypt/archive/www.k4750.net/
total 16
-rw-r--r-- 1 root root 1793 Mar 12 20:56 cert1.pem
-rw-r--r-- 1 root root 1675 Mar 12 20:56 chain1.pem
-rw-r--r-- 1 root root 3468 Mar 12 20:56 fullchain1.pem
-rw-r--r-- 1 root root 1708 Mar 12 20:56 privkey1.pem

設定に必要なファイルが一通り作成されていることが確認できた。試しにopensslコマンドで証明書の有効期間を確認してみると、

# openssl x509 -text < /etc/letsencrypt/live/www.k4750.net/cert.pem
Certificate:
    ......
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=US, O=Let's Encrypt, CN=Let's Encrypt Authority X1
        Validity
            Not Before: Mar 12 10:56:00 2016 GMT
            Not After : Jun 10 10:56:00 2016 GMT
        Subject: CN=www.k4750.net
        ......

3月12日~6月10日であり、90日間となっていることが分かる。


4.Apache設定

mod_sslの設定を以下のとおりとする。

SSLCertificateFile /etc/letsencrypt/live/www.k4750.net/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.k4750.net/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.k4750.net/chain.pem

ついでに証明書の自動更新設定をcronに仕込んでおく。毎月初日、AM5:00に(必要に応じて)証明書の更新を行う。

# m h dom mon dow command
0 5 1 * * service apache2 stop && /var/www/ssl/letsencrypt/letsencrypt-auto renew && service apache2 start

停止せずに更新する方法もあるようだが、、ひとまず上記で運用してみる。


5.WordPress設定、投稿内容変更

WordPressの「設定」→「一般」の「WordPress アドレス (URL)」と「サイトアドレス (URL)」を「https://www.k4750.net」へ変更。

投稿内容については、例えばサイト内のメディア(画像)へのリンクは

旧:<img src="http://www.k4750.net/wp-content/uploads/2015/10/DSC_0447.jpg" />
↓
新:<img src="//www.k4750.net/wp-content/uploads/2015/10/DSC_0447.jpg" />

というように「http:」部分を削除し、SSL/非SSLのどちらでも対応可能とした。また、amazonの商品画像は

旧:http://ecx.images-amazon.com/images/I/71J%2B8rWs3uL.jpg
↓
新:https://images-na.ssl-images-amazon.com/images/I/71J%2B8rWs3uL.jpg

というように画像を提供しているホスト名部分を含めて変更した(これが正しいやり方かどうかは・・・不明)。

(正しい)オレオレ証明書の作り方

UbuntuのApache2にて(簡易に)SSL通信する際は、make-ssl-certコマンドを使い「自己署名証明書(self-signed certificate)」(いわゆる、オレオレ証明書)をサーバー証明書として作るのが手っ取り早い上に確実(※1)である。以下にmake-ssl-certコマンドの使い方および、このコマンド(shell-script)が実行している内容について書く。

※1 確実=オレオレ証明書を正確に作れるという意味。


1.make-ssl-cert

標準の/etc/apache2/site-available/default-sslを有効にして使用している場合は特に何もする必要はない。既にインストール時に生成されたオレオレ証明書を使用する設定になっている。なお、ホスト名の変更等を行った場合は、以下を実行することで、オレオレ証明所を再生成することができる(rootで実行する必要)。

# make-ssl-cert generate-default-snakeoil --force-overwrite

2.何をやっているか

make-ssl-certコマンドは単なるShellスクリプトであり、上記をパラメータとして実行した場合、以下の(ような)内容が実行される。

# TMPFILE="$(mktemp)"
# HostName="$(hostname -f)"
# sed -e "s#@HostName@#$HostName#" /usr/share/ssl-cert/ssleay.cnf > $TMPFILE
# openssl req -config $TMPFILE -new -x509 -days 3650 -nodes 
  -out /etc/ssl/certs/ssl-cert-snakeoil.pem 
  -keyout /etc/ssl/private/ssl-cert-snakeoil.key
# chmod 644 /etc/ssl/certs/ssl-cert-snakeoil.pem
# chmod 640 /etc/ssl/private/ssl-cert-snakeoil.key
# chown root:ssl-cert /etc/ssl/private/ssl-cert-snakeoil.key
# cd /etc/ssl/certs/
# ln -sf ssl-cert-snakeoil.pem $(openssl x509 -hash -noout -in ssl-cert-snakeoil.pem)

これにより(中間ファイルはさておき)二つのファイルssl-cert-snakeoil.pemファイル(オレオレ証明書)、ssl-cert-snakeoil.keyファイル(秘密鍵)が生成され、最後にパーミッションの設定等が自動的に行われる。

コマンドの実行状況を見て思うのは、証明書を作る際は、ファイルを生成する以外にも思いのほかやることがあるということ。パーミッションの設定については語られているサイトはあるが、最後のシンボリックリンクを生成する部分(ln -sf …)については、実行状況を見て初めて知った。

自前で“正しく”オレオレ証明書を作りたいのであれば、make-ssl-certコマンドを使うのが手っ取り早い上に、システムにとっても整合的である。


3.ファイルの内容

オレオレ証明書や秘密鍵の内容は、それぞれ以下のコマンドを実行して確認することができる。

# openssl x509 -text < /etc/ssl/certs/ssl-cert-snakeoil.pem
# openssl rsa -text < /etc/ssl/private/ssl-cert-snakeoil.key

内容からは、証明書の有効期間が発行後10年であること、公開鍵暗号方式がRSA(2048bit)であること、発行者(Issuer)および主体者(Subject)が同じ=オレオレ証明書であること等が読み取れる。

SSLを最短で有効化

WordPressの管理画面へhttpsでアクセスできるように設定した際のメモ。ただし、面倒な作業は極力避け、SSLを最短の手数で有効化する。なお、いわゆる「オレオレ証明書(self-signed certificate)」はデフォルトでインストールされているものを使用せずに、今回のSSL化に伴い再生成している。環境はUbuntu 12.04.3 LTS + Apache2。


1.SSL有効化

Apache2のSSLを有効化。オレオレ証明書は再生成する(make-ssl-cert)。

# a2enmod ssl
# a2ensite default-ssl
# make-ssl-cert generate-default-snakeoil --force-overwrite
# service apache2 restart

WordPressのログインおよび管理画面へのアクセスでhttpsを強制するためにwp-config.phpへ以下を追記する。

define('FORCE_SSL_ADMIN', true);

2.make-ssl-cert

make-ssl-certコマンドの正体(何をやっているのか)については後日投稿予定


3.参考