WordPress+Nginx+Let’s encryptでSSLサイト評価「A」にしてみた

1. Let’s Encrypt 導入のための前提
2. Let’s Encrypt のクライアントcertbotインストール
3. 証明書の取得
4. Perfect Forward Security (PFS) 2048bitの鍵を生成
5. Nginx conf 設定
6. SSLサイト評価確認
7. Let’s encrypt 自動更新
8. 楽にWordpressをSSL化する

1. Let’s Encrypt 導入のための前提

・ Nginxインストール済み
・ PHP-FPMインストールと設定済み
・ 80、443ポート開放済み
・ WordPress設定済み
・ ドメインがDNSで名前解決可能

2. Let’s Encrypt のクライアントcertbotインストール

$ cd /usr/local/src
$ sudo git clone https://github.com/certbot/certbot
$ cd certbot

certbotのhelpを確認しておく

$ sudo ./certbot-auto --help

3. 証明書の取得

$ sudo ./certbot-auto certonly --webroot -w { ドキュメントルート } -d { ドメイン名 } --email { メールアドレス }

正常に完了すると・・・

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for kishi-r.com
Using the webroot path { ドキュメントルート } for all unmatched domains.
Waiting for verification...
Cleaning up challenges
 
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/{ ドメイン名 }/fullchain.pem. Your cert will
   expire on 2017-09-06. To obtain a new or tweaked version of this
   certificate in the future, simply run certbot-auto again. To
   non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - 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

となる。
これで証明書が発行される。場所は「NOTES」へ記載されているとおり、

/etc/letsencrypt/live/{ ドメイン名 }/fullchain.pem

となる。
ここへ後ほど使用する「privkey.pem」なども一緒に同胞されているので、
念のため確認しておく。

4. Perfect Forward Security (PFS) 2048bitの鍵を生成

wiki pedia 引用 (https://ja.wikipedia.org/wiki/Forward_secrecy)
forward secrecy(perfect forward secrecy、略してFSあるいはPFSとも呼ばれる[1]。日本語で前方秘匿性とも[2])は、長期的な鍵対からセッションキーを生成した際に、のちに長期鍵の安全性が破れたとしてもセッションキーの安全性が保たれるという、鍵交換プロトコル(英語版)の持つ性質である。この特性を守るためには、データを暗号化するための鍵から別の鍵を生成してはならないし、そしてデータを暗号化する鍵の素材となる秘密は一度だけの使い捨てにしなければならない。そうすることで、1つの鍵が破れたとしても被害がほかの鍵に及ばないようになる。

$ cd /etc/nginx/ssl
$ sudo openssl dhparam 2048 -out dhparam-2048.pem
$ sudo chown root:root dhparam-2048.pem
$ sudo chmod 600 dhparam-2048.pem

5. Nginx conf 設定

WordPress用にnginxのconfを作成して設定を行う。

$ sudo vim /etc/nginx/conf.d/wordpress.conf

WordPressの設定は各環境へ併せてください。

#
# The default server
#
server {
  listen       443 ssl;
  server_name  { ドメイン名 };
 
  client_max_body_size 20M;
 
  ssl_certificate     /etc/letsencrypt/live/{ lets encrypt設定ドメイン名 }/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/{ lets encrypt設定ドメイン名 }/privkey.pem;
 
  ssl_session_timeout 1d;
 
  ssl_dhparam /etc/nginx/ssl/dhparam-2048.pem;
 
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
  ssl_prefer_server_ciphers on;
 
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /etc/letsencrypt/live/{ lets encrypt設定ドメイン名 }/fullchain.pem;
  resolver 8.8.8.8;
 
  root { wordpress ドキュメントルート };
  index index.php;
 
  location ~* /wp-login\.php|/wp-admin/(^admin-ajax\.php) {
    auth_basic "Restricted";                   # 認証時に表示されるメッセージ
    auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルのパス
    try_files $uri $uri/ @wordpress;
  }
 
  location = /xmlrpc.php {
    deny all;
  }
 
  location / {
    try_files $uri $uri/ @wordpress;
  }
 
  location ~ \.php$ {
    try_files $uri @wordpress;
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME  { wordpress ドキュメントルート }$fastcgi_script_name;
    include fastcgi_params;
  }
 
  location @wordpress {
    fastcgi_index index.php;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    fastcgi_param SCRIPT_FILENAME  { wordpress ドキュメントルート }/index.php;
    include fastcgi_params;
  }
 
  include /etc/nginx/default.d/*.conf;
}

完了したらNginxとPHP-FPMを再起動。

systemctl restart php-fpm
systemctl restart nginx

6. SSLサイト評価確認

SSLサイト評価の確認は下記サイトから行います。

https://www.ssllabs.com/ssltest/analyze.html

A評価になっているのでこれで目的は達成

7. Let’s encrypt 自動更新

下記コマンドで更新が行えるか確認

$ sudo /usr/local/src/certbot/certbot-auto renew --post-hook "sudo service nginx restart"
 
Saving debug log to /var/log/letsencrypt/letsencrypt.log
 
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/{ ドメイン名 }.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
 
The following certs are not due for renewal yet:
  /etc/letsencrypt/live/{ ドメイン名 }/fullchain.pem (skipped)
No renewals were attempted.
No hooks were run.

renewは期限が迫らないうちは実行がスキップされるので、
(skipped)となっているのでとりあえずこれでOK

あとはCronへ登録する

$ sudo su
$ vim /etc/cron.d/letsencrypt

とりあえずは「毎月1日の3:00に更新」で試してみる。

0 3 1 * * root /usr/local/src/certbot/certbot-auto renew --post-hook "sudo service nginx restart"

で保存して完了。

8. 楽にWordpressをSSL化する

Really Simple SSLを使うと楽にSSL化される。
注意点としては「Javascript」で内部リンクや画像のsrcが切り替わるので、それが嫌な場合は使用しない方が良い。
かつ「一般設定」のサイトURLも自動で「http」から「https」へ切り替わるので、こちらも注意しておきたいが楽にやりたい場合はこれで良いかなって感じです。

MT3.3からWordPress2.5への移行時に行った事

メモ代わりに。

移行する際に気になるのがパーマリンクの保持。

ようは以前と同じURLで移行しないとダメだよねって事で、

色々と調べてみたが最新の2.5対応が無かったorz

でもやる事としては、同じだよね。

  1. パーマリンクの保持
  2. タグの保持
  3. RSSフィードのURLの保持
  4. トラックバックとコメントの保持

位かな。

4のトラックバックとコメントはそのままデータをインポートすればOKで、

3のRSSフィードはMTのRSSのURLを.htaccessでリダイレクトしてやるなどで、

対処出来そう。

ただ1のパーマリンクと2のタグがやっかいだった。

そこで参考にしたのが、

ググったら絶対上位に出てくるサイト

MovableTypeからWordPressへのURL込みの移行方法

ここが解りやすいので、参考にさせていただきました。

まずやる流れが下記になる。

  1. WordPressのインストール
  2. WordPressのパーマリンクの設定
  3. MovableTypeへのパッチ
  4. WordPressへのパッチ
  5. MovableTypeからデータをエクスポート
  6. WordPressへデータをインポート

1.WordPressのインストール

WordPressの日本語サイトから最新バージョンの2.5をダウンロードしてくる。

インストール作業自体は以前のバージョンよりも全然簡単になっているので、

WordPress日本語版のインストールを見れば簡単にサクっと出来るはず。

2.WordPressのパーマリンクの設定

インストールが完了したらパーマリンクの設定になるので、

にあるタブから「設定」を選択して「パーマリンク設定」を選択する。

そうすると「一般的な設定」に「カスタム構造」というのがあるので、それを選択する。

設定内容は下記になる。

/%year%/%monthnum%/%postname%.html

この「カスタム構造」は「.htaccess」を使用するため書き込み権限が無いとダメみたいです。

その場合、ガイダンスが表示されるみたいなのでそちらの指示に従ってください。

3.MovableTypeへのパッチ

こちらは、MovableTypeからWordPressへのURL込みの移行方法参考にするのが一番良い。

実際にも記載されている通りにやりましたので、一応書いておきます。

mt(MTをインストールしたディレクトリ)/lib/MT/ImportExport.pmファイルの541行目へ追加を行う。

丁度540行目にある

DATE: <$MTEntryDate format="%m/%d/%Y %I:%M:%S %p"$>

の下に

PERMALINK: <$MTEntryPermalink$>
<MTEntryIfTagged>
TAGS: <MTEntryTags glue=","><$MTTagName$></MTEntryTags></MTEntryIfTagged>
ID: <$MTEntryID$>

を追加する。

4.WordPressへのパッチ

これは何処にも載っていなかったが、

以前のバージョンへの対応を見れば簡単に解る。

ファイルは色々なサイトに記載されている通り

wordpress/wp-admin/import/mt.php

になる。

このファイルの丁度325行目に追加する。

以前のバージョンでは「PHPのSwitch」で処理されていたみたいだが、

最新は「ifとかelseifとか」で処理されてたw

[sourcecode language=’php’]
} else if ( 0 === strpos($line, “PERMALINK:”) ) {
$value = trim( substr($line, strlen(“PERMALINK:”)) );
$tmpvalue = strrchr($value,”/”);
$post->post_name = substr($tmpvalue, 0, strpos($tmpvalue, “.”));
[/sourcecode]

この4行を追加する。

なぜこの4行を追加するかと言うと、

DBへインポートする際に「wp_post」テーブルのカラム「post_name」へMTの記事データのタイトルが入ってしまうため、記事とURLのつながりが無くなってしまう為にパーマリンクがちゃんと保持されないという現状になるみたいです。

なので、上記を追加する事で正常にデータがインポートされます。

5.MovableTypeからデータをエクスポート

次に記事データをエクスポートします。

MovableTypeの管理画面のメニューから「読み込み・書き出し」を選択する。

上記タブから「エントリーの書き出し」を選択する。

最後に「~からエントリーを書き出す」ボタンをクリックするとデータが「.txt(テキスト形式)」で保存されます。

中身は、

AUTHOR: kishi-r
TITLE: 最近読む著者たち
STATUS: Publish
ALLOW COMMENTS: 1
CONVERT BREAKS: __default__
ALLOW PINGS: 1
PRIMARY CATEGORY: Book
CATEGORY: Book

DATE: 12/04/2006 09:49:02 PM
PERMALINK:
TAGS: book
ID: 8
—–
BODY:
・石田衣良
ご存知、池袋ウエストゲートパークを書いている人
他にも結構面白い本が沢山ある。
例えば、「4TEEN」「うつくしい子ども」「エンジェル」「ブルータワー」などがおもしろかった。
一番グっときたのは「ブルータワー」です。
簡単に説明すると内容はSFなんですが、
現代と自分の頭の中の世界を行き来し、世界を救うという話です。
それぞれ登場するキャラが個性的でおもしろい。
映画化すると結構人気がでるかもしれない。
他の作品も是非読んで欲しい。

・・・・・・・・以下続きます。

って感じで保存されているはずです。

6.WordPressへデータをインポート

最後にWordPressへデータをインポートします。

管理画面から下記画面にある「管理」を選択します。

その中にある「インポート」を選択します。

そうすると色々なブログの選択項目が出てくるので、ここから「MovableTypeとTypePad」を選択します。

次に「自分のコンピュータからファイルを選択する」で先ほどエクスポートしたファイルを選択して、

真ん中にある「ファイルをアップロードしてインポート」ボタンをクリックすれば自動でインポートされます。

これでパーマリンクへの対応は完了です。

このブログ自体も上記の手順で移行しました。

RSSのフィードもさくらインターネットであれば、リダイレクトも出来たので多分OKなのかな?

タグに関してはまた試してみて記載しようと思います。