KUSANAGI(WordPress)をLet's EncryptでSSL対応する

```
この記事の内容は古いです。KUSANAGIは7.8で公式にLet's Encrypt対応が行われました。
```

KUSANAGIは「超高速WordPress仮想マシン」とうキャッチで、[いろいろなクラウドで使える](http://kusanagi.tokyo/cloud/)WordPress実行環境です。KUSANAGIはnginx + hhvm + Percona Serverという構成が基本で、そこに[開発元](https://www.prime-strategy.co.jp/)の独自チューニングが施されているものです。

そして、[Let's Encrypt](https://letsencrypt.org/)は、無償で利用できるSSL/TLS証明書の発行サービスで、現在公開ベータプログラムというステータスです。

これらを組み合わせて、SSL/TLS対応のWordPressサイトが無料で作れます。

Let's Encryptはコマンドラインツールを使って証明書の発行/更新など管理を行います。[オフィシャルの解説](https://letsencrypt.jp/docs/using.html)もわかりやすいので簡単です。

ただ、証明書発行の過程でドメインの所有者確認があり、これは外部から自サーバーのポート80にアクセスが来ます。KUSANAGIの場合はWebサーバーなどがセットアップ済みであり、この所有者確認に失敗してしまいます。ここに少し工夫が必要です。

## 事前準備

この辺はあらかじめ済ませておきます。

* ドメインの取得
* ホスト名の決定 *(今回はkusanagi.hironobu.orgとする)*
* DNSの設定

## KUSANAGIの初期設定とプロビジョニングをする

KUSANAGIの初期設定とプロビジョニング(サイト作成)を済ませておきます。以下の順番通り、マニュアルに沿って実行します。そして、ブラウザでURLを叩いてサイトが表示されることを確認します。

1. [KUSANAGI for ConoHaのご利用方法](http://kusanagi.tokyo/cloud/kusanagi-for-conoha/)
2. [KUSANAGIの初期設定](http://kusanagi.tokyo/document/kusanagi-init/)
3. [WORDPRESSのプロビジョニング](http://kusanagi.tokyo/document/kusanagi-provision/)


<img width="750" alt="kusanagi-ssl_–_Just_another_WordPress_site.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/208c4b7c-2386-bd1a-4932-4b96584951c8.png">


## Let's Encryptクライアントのインストールと証明書の取得

[オフィシャルサイトの手順](https://letsencrypt.jp/docs/using.html)に沿ってクライアントをインストールします。

```shell-session
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
```

本来はここで「./letsencrypt cert」などを実行するのですが、このコマンドはポート80とLISTENしようとするので、すでにKUSANAGI(WordPress)実行中の場合はエラーになります。

実は[英語サイトの方に解説](https://letsencrypt.org/howitworks/)があるのですが、--webrootと言うオプションを使うと、既に稼働しているWebサーバーとそのDocumentRootを使って本人確認の手続きを進めることができます。オプションは以下のような書式です。-wがDocumentRootのパス、-dがホスト名です。

```shell-session
./letsencrypt-auto certonly --keep-until-expiring --webroot -w /var/www/example.com -d example.com,www.example.com 
(オフィシャルサイトから引用)
```

これを実行すると、DocumentRoot配下に/.well-known/acme-challenge/というディレクトリが作成され、その中にランダムな名前のファイルが作られます。本人確認は、そのURLに外部からアクセスできるかを確認することで行われます。以下のようなURLです。

```text
http://kusanagi.hironobu.org/.well-known/acme-challenge/xxxxxxxxxxxxxxxx.html
```

KUSANAGI上でこのURLを作っても、403 Forebiddenになっていしまい、本人確認に失敗します。ここに少し工夫が必要です。

### nginxの設定変更

.well-known配下のファイルにアクセスできるようにします。KUSANAGIのサイト毎の設定ファイルは/etc/nginx/conf.d/[プロファイル名]_http.confです。"location /"の上に以下の設定を追加して、nginxをリロードします。

```nginx
    location ~ /.well-known {
      allow all;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
```

その後、以下のコマンドを実行します。KUSANAGIのDocumentRootは以下のように/home/kusanagi/[プロファイル名]/DocumentRootになります。

```shell-session
./letsencrypt-auto certonly --webroot -w /home/kusanagi/[プロファイル名]/DocumentRoot/ -d kusanagi.hironobu.org
```

これで証明書が取得できます(出力は以下のようになります)

```shell-session
# ./letsencrypt-auto certonly --webroot -w /home/kusanagi/main/DocumentRoot/ -d kusanagi.hironobu.org
Updating letsencrypt and virtual environment dependencies......
Requesting root privileges to run with virtualenv: /root/.local/share/letsencrypt/bin/letsencrypt certonly --webroot -w /home/kusanagi/main/DocumentRoot/ -d kusanagi.hironobu.org

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/kusanagi.hironobu.org/fullchain.pem. Your
   cert will expire on 2016-05-02. To obtain a new version of the
   certificate in the future, simply run Let's Encrypt again.
 - If you like Let's Encrypt, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

証明書とキーファイルなどは/etc/letsencrypt/配下に保存されます。

## nginxにSSLの設定をする

SSLの設定ファイルは/etc/nginx/conf.d/[プロファイル名]_ssl.confです。一番上のあたりに証明書とキーファイルを指定するディレクティブ(ssl_certificateとssl_certificate_key)があるので、これを書き換えます。fullchain.pemが中間証明書も含んだ証明書ファイルです。

```nginx
server {
    listen       443 ssl;
    server_name  kusanagi.hironobu.org;

    ssl_certificate     /etc/letsencrypt/live/kusanagi.hironobu.org/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/kusanagi.hironobu.org/privkey.pem;

(以下略)
```

そしてnginxをリスタートします。(CentOS7とかの場合はsystemctl)

```
service nginx restart
```

## WordPressの設定

サーバー側の設定は以上です。最後にWordPressの「サイトアドレス」をhttpsに変更して完了です。http://[ホスト名]/wp-adminからログインして「設定」→「一般設定」を開いて、「WordPressアドレス」と「サイトアドレス」を変更します。これをしておかないと、メディアファイルのURLがhttpのままになってしまいます。

<img width="913" alt="一般設定_‹_kusanagi-ssl_—_WordPress.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/a1030e3c-a262-cee0-b44d-00c10a020ca2.png">

## 完了

証明書情報を確認して問題ないことを確認します。無料でSSL/TLS証明書が取得できるのはありがたいですね。

また、KUSANAGIは色々チューニングが入っていますが、設定ファイルなどは結構シンプルなので、自分で色々カスタマイズすることもできそうです。

<img width="912" alt="kusanagi-ssl_–_Just_another_WordPress_site_と_新規投稿_-_Qiita.png" src="https://qiita-image-store.s3.amazonaws.com/0/44152/cbd23dfc-730c-cf20-af27-33271b559932.png">