kusanagiによる常時SSL化 Let’s Encryptで!

今回は、Webサーバー

Nginxにて常時SSL化

を行う手順

証明書は、Let’s Encryptを使用する。

前提
・そもそもドメインがある
・取得したいドメインがDNSで名前解決できる
・80番ポートでアクセスできる

基本手順

パターン1 KUSANAGI導入段階でSSL化する

KUSANAGIのプロビジョニングの際に設定する。

これは、参照ここ

対話形式
# kusanagi provision

で対話形式でのプロビジョニングができるので、ここでLet’s Encryptの設定を行う方法。

パターン2 KUSANAGI化しているhttpサイトを常時SSL化

既にKUSANAGI環境上でhttpにて運用しているサイトに証明書を当てる場合

1.kusanagiコマンドで片付ける

# kusanagi ssl --email {メールアドレス} {プロファイル名}

で行う。

参考1
参考2

2−1.コンソールから、Let’s EncryptのSSL証明書を発行してもらうコマンドを入力します。メールアドレスは自身が受信可能なものであれば何でも構いません。

kusanagi target {プロファイル名}
kusanagi ssl --email {メールアドレス}

SSL証明書の発行が成功すると、内部的にはwp-cliのsearch-replaceコマンドが実行され、データベース内のURLも「http://example.com」から「https://example.com」へと変更となります。また、SSL証明書(90日有効)を自動更新する設定も行われます。

2−2.データベース内の情報はwpコマンド(wp-cli)などを用いて、ファイル内はfindコマンドとgrepコマンドなどを用いて当該部分を特定して修正

例えば、WordPressをインストールしたディレクトリに移動して、以下のコマンドを入力すれば、データベース内の情報を置換

wp search-replace --path=/home/kusanagi/{プロファイル名}/DocumentRoot 'http://example.com' 'https://example.com' --dry-run
※置換する際は、まず –dry-runを付けて、テストを行うこと。 そしてその結果を何処かにコピーしておくこと。→ 置換を間違えた際にやり直しの材料となるため。
※便宜上、–path=/home/kusanagi/{プロファイル名}/DocumentRootで指定していますが、カレントディレクトリが、/home/kusanagi/{プロファイル名}/DocumentRootにいるのであれば付けなくてもOK

wp search-replace --path=/home/kusanagi/{プロファイル名}/DocumentRoot 'http://example.com' 'https://example.com' --dry-run
※–dry-runで問題なかったら、 –dry-runを外して本当の置換を行う

2−3.同様に、WordPressをインストールしたディレクトリで、以下のコマンドを入力すると、PHPファイル内に記述されているHTTPプロトコルでのURLに関する文字列を検索

find ./ -name '*.php' | xargs grep 'http://example.com'
※置換がされていない部分があるかどうか、findコマンドで確認する

2−4.HTTPからHTTPSへリダイレクトさせる設定および「HSTS(HTTP Strict Transport Security)」の設定を行います。

kusanagi ssl --https redirect --hsts weak --auto on

2−5.WordPressの管理画面「設定」から、「一般」のなかにある、WordPress アドレス (URL)、サイトアドレス (URL)をhttpsのものに変更する。

これでLet’s Encryptを用いた常時SSL、HTTP/2化の基本処理は完了!
ブラウザで正しくアクセスできるかを確認してください。

※その他確認項目
・Nginxのコンフファイル
/etc/nginx/conf.dの中にある、

{プロファイル名}_ssl.conf の設定確認

この中で、1行目から、
1 #=======================================
2 # ドメイン名 SSL
3 #---------------------------------------
4
5 server {
6 listen 443 ssl http2;
7 server_name ドメイン名;
8
9 ssl_certificate /etc/letsencrypt/live/{ドメイン名}/fullchain.pem;
10 ssl_certificate_key /etc/letsencrypt/live/{ドメイン名}/privkey.pem;
11 ssl_dhparam /etc/kusanagi.d/ssl/dhparam.key;

と、
・server_nameがしっかりと対象ドメイン名になっていること
・ssl_certificate, ssl_certificate_keyがletsencryptディレクトリ内の対象ドメイン名鍵ファイルとなっていること

を確認する。

パターン3 KUSANAGI使わずに常時SSL化

3−1.certbot のインストール

certbotは、Let’s Let’s Encryptのクライアントなので、これをgitでclone

とりあえず/usr/localへ
$ cd /usr/local

$ git clone https://github.com/certbot/certbot
$ cd certbot

確認
$ ./certbot-auto --help

helpの表示が出てくればOK!

3−2.証明書の取得

$ ./certbot-auto certonly --standalone -t

不足パッケージのインストールが必要な場合は、インストールする。

すると、メールアドレスを聞いてくるので、受信ができるメールアドレスを入力する。
Creating virtual environment...
Installing Python packages...
Installation succeeded.
Enter email address (used for urgent notices and lost key recovery) (Enter 'c' to cancel): メールアドレスを入力!!

そして、ライセンスにAgreeする。
-------------------------------------------------------------------------------
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

Aと入力してEnter

その後、いよいよドメインを入力する
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel):ドメイン名を入力!!

3.取得した証明書を見てみる

cert-botにより取得した証明書一式は /etc/letsencrypt/ 以下に次のようなディレクトリ構成で保存されている。
webサーバの設定で指定するのは/etc/letsencrypt/live/以下にあるシンボリックリンク。

/etc/letsencrypt/
├── accounts/ # アカウント情報
├── archive/ # 取得した証明書の実体がドメインごとのサブディレクトリに保存されている
│ └── ドメイン名
├── csr
├── keys
├── live/ # 最新の証明書へのシンボリックリンクが作られる。
│ └── ドメイン名
│ ├── cert.pem -> ../../archive/{ドメイン名}/cert2.pem
│ ├── chain.pem -> ../../archive/{ドメイン名}/chain2.pem
│ ├── fullchain.pem -> ../../archive/{ドメイン名}/fullchain2.pem
│ └── privkey.pem -> ../../archive/{ドメイン名}/privkey2.pem
└── renewal/ # 証明書更新のための設定が保存されている。
└── {ドメイン名}.conf

4.Nginxの設定をする

取得した証明書をNginxに設定してSSLを有効にする。
Nginxのconfファイルに下記を入力する。

/etc/nginx/conf.d/{プロファイル名}_ssl.conf

server {
...
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/{ドメイン名}/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/{ドメイン名}/privkey.pem;
...
}

<解説>
ssl_certificateにはサーバ証明書と中間証明書が結合されたfullchain.pemのパスを設定する。
ssl_certificate_keyには証明書と対の秘密鍵であるprivkey.pemのパスを指定する。
証明書を指定する場合、実体の/etc/letsencrypt/archive/以下のファイルは後述の証明書の更新をするとファイル名が変わってしまうので、/etc/letsencrypt/live/以下のシンボリックリンクを指定する。

証明書の取得、Webサーバーへの設定はこれで完了!!

残りは、パターン2でやっていたように、httpの部分をhttpsに置換してあげる作業をする。
wp search-replace --path=/home/kusanagi/{プロファイル名}/DocumentRoot 'http://example.com' 'https://example.com' --dry-run

更に、WordPressの管理画面「設定」から、「一般」のなかにある、WordPress アドレス (URL)、サイトアドレス (URL)をhttpsのものに変更する。

で常時SSL化は完了!

参考

次は、自動更新など、証明書の更新について書いていきたい。
※Let’s Encryptは、証明書の有効期限が90日なもんで((((;゚Д゚))))ガクガクブルブル

Leave a Reply

Your email address will not be published. Required fields are marked *