AWS上のWordpressでLet's Encryptを利用する


## 目的

AWS EC2上のWordpressをhttpsで接続させたい。現在はhttpで接続を受け付けている。

Wordpressはbitnamiのパッケージをインストールした。

## この記事の全体像

1. 証明書を作成する
2. ELBの設定を行う
3. Wordpress側の設定を行う


## 1. 証明書を作成する

### ポイントは以下の通り

* AWS上のFWを解放する
* sslで利用するドメイン配下のサーバで作成する

### 作業流れ

* ELB(ロードバランサ)の443ポートを空ける
  とりあえずTCPで443を空ける必要がある(証明書がまだないからhttpsはあけられない)

  ![elb_open.png](https://qiita-image-store.s3.amazonaws.com/0/80151/d37f7fc8-7960-1066-b96c-dd6cc8ebf525.png "elb_open.png")

* EC2側で443を受け付ける
  インスタンス→セキュリティグループ→インバウンド
  ![EC2_open.png](https://qiita-image-store.s3.amazonaws.com/0/80151/105b8f67-510d-86e5-ec85-83a5bb7e82c5.png "EC2_open.png")


* letsencryptのコマンドを実行する
  helpするとパッケージがDLされる。Congratulations!と出れば成功。

  ```shell
  $ git clone https://github.com/letsencrypt/letsencrypt
  $ cd letsencrypt
  $ ./letsencrypt-auto --help
  $ ./letsencrypt-auto certonly -a standalone -d <domain>
  Updating letsencrypt and virtual environment dependencies......
  Requesting root privileges to run with virtualenv: sudo /home/bitnami/.local/share/letsencrypt/bin/letsencrypt certonly --standalone -d <domain>
  
  IMPORTANT NOTES:
   - Congratulations! Your certificate and chain have been saved at
     /etc/letsencrypt/live/column.clintal.com/fullchain.pem. Your cert
     will expire on 2016-05-08. 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/archive/<domain>`にあることに注意

  ```shell
  $ sudo ls /etc/letsencrypt/live/<domain>
  ```  


### エラー
* ELBでポートがちゃんと開放できていないと以下のエラーが表示される

  ```
  IMPORTANT NOTES:
   - The following errors were reported by the server:

      Domain: <domain>
      Type:   urn:acme:error:connection
      Detail: Failed to connect to host for DVSNI challenge
   ```

### まとめ

* ここまでが準備


## 2. ELBの設定を行う

### ポイントは以下の通り

* アップする内容を間違えないように

### 作業流れ

* ELBにSSL証明書をアップする
  ロードバランサ→リスナー→編集
  * ロードバランサーのプロトコル: HTTPS(セキュアHTTP), 443
  * インスタンスのプロトコル: HTTP, 80
  * SSLは1で取得したファイルの中身をそのままコピペする
     - プライベートキー: privkey1.pem 
     - パブリック証明書: cert1.pem                                                                                                                               
     - 証明書チェーン: chain1.pem
* 完成図はこんな感じ
  ![ELB_complete.png](https://qiita-image-store.s3.amazonaws.com/0/80151/dbcade9b-45df-8c2e-4888-097c1ebbd86c.png "ELB_complete.png")


### まとめ

* ここまでできると、サイトへhttpsでアクセスすることができる
* ただし、CSSとかが残念な感じ
* httpは今まで通り利用可能


## 3. Wordpress側で設定する

### ポイントは以下の通り

* 管理ページについて、`wp-config.php`に記載する場所に注意


### 作業流れ

* サイトURLを変更する
  管理画面から変更できれば画面から。できない場合はwp-config.phpを編集する
  
  ```wp-config.php
  define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
  define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');
  ```

* 管理画面のSSL化
  wp-config.phpに以下を記載する。
  ただし`require_once(ABSPATH . 'wp-settings.php');`より前に書かないとダメらしい！

  ```wp-config.php
  define('FORCE_SSL_ADMIN', true);
  if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
    $_SERVER['HTTPS'] = 'on';
  }
  ```

### エラー

管理画面の設定の書く場所を間違えると、ログイン後に(ログイン画面は問題ない)以下のエラーが発生して混乱する。
ググっても、DBのテーブルの接頭辞を変更しろとかばっかり出てきて困る。

```画面エラー
このページにアクセスするための十分なアクセス権がありません
```

### まとめ

* これで管理画面は対応完了
* 通常画面は、HTTPでもHTTPSでもどちらでもアクセスできるようになっているはず



## 参考

* https://letsencrypt.jp/usage/