GCEで、Nginx+Tomcatインストール後、最初に行うSSL設定

#手順
1. Let's Encrypt で証明書を発行
2. Tomcat のHTTPS通信用ポートを開ける
3. Nginx の設定を変更
4. Tomcat の設定を変更
5. SSL安全性チェック
6. SSL証明書の更新設定

## Let's Encrypt で証明書を発行

```
sudo apt-get install certbot
```

Let's Encrypt は Python で動いており、実行時に文字コードエラーが出る場合があるので、確認・変更しておく。

```
python
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
```

これを utf-8 に変える。

```
sudo vi /usr/lib/python2.7/sitecustomze.py
```

最後に2行を追加。

```python
# install the apport exception handler if available
try:
import apport_python_hook
except ImportError:
pass
else:
apport_python_hook.install()
 
import sys
sys.setdefaultencoding('utf-8')
```

また、ドメイン所有者の認証のために TCP ポートの 80 番と 443 番に接続されるので、開放されてなければ開放しておく。

Nginx と Tomcat は一旦停止しておく。

```
sudo /etc/init.d/nginx stop
sudo /etc/init.d/tomcat stop
```

certbot を実行する。

```
certbot certonly --standalone -d example.jp
```
example.jp は自分のドメインに置き換える。

##Tomcat のHTTPS通信用ポートを開ける
Nginx で443ポートを待ち受け、Tomcat で設定する58080ポートに繋ぐようにするため、GCEファイアーウォール設定で、58080ポートを開けておく。

1. Google Cloud Platform のサイドメニュー→VPCネットワーク→ファイアウォールルール
2. 上側にある「ファイアウォールルールを作成」をクリック
3. 内容をそれぞれ設定し、作成をクリック
    - 名前：firewall-58080（任意）
    - ターゲット：指定されたターゲットタグ
    - ターゲットタグ：firewall-58080
    - ソースIDの範囲：0.0.0.0/0
    - プロトコルとポート：tcp:58080
4. VMインスタンスの画面で、公開するインスタンスの名前をクリック
5. 上側にある「編集」をクリック
6. 中段付近にある「ネットワークタグ」に「firewall-58080」を追加
7. 保存をクリック

##Nginx の設定を変更

/etc/nginx/sites-enabled/tomcat.conf を作成。

```tomcat.conf
# HTTP
server {
  client_max_body_size 20M;
  listen 80;
  server_name example.jp;

  root /var/www/tomcat;

  access_log /var/log/nginx/tomcat_access.log;
  error_log /var/log/nginx/tomcat_error.log;

  location / { 
    proxy_pass http://127.0.0.1:8080/;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

# HTTPS
server {
  client_max_body_size 20M;
  listen 443 ssl;
  server_name example.jp;

  root /var/www/tomcat;

  ssl on;
  ssl_prefer_server_ciphers on;
  ssl_protocols		TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers       'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
  ssl_certificate	/etc/letsencrypt/live/example.jp/fullchain.pem;
  ssl_certificate_key	/etc/letsencrypt/live/example.jp/privkey.pem;
  ssl_trusted_certificate /etc/letsencrypt/live/example.jp/chain.pem;

  access_log /var/log/nginx/tomcat_access.log;
  error_log /var/log/nginx/tomcat_error.log;

  location / {
    proxy_pass http://127.0.0.1:58080/;
  }
}
```
example.jp（5カ所）は自分のドメインに変更する。

設定ファイルの文法チェック。

```
sudo nginx -t
> nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
> nginx: configuration file /etc/nginx/nginx.conf test is successful
```
問題があれば、設定ファイルを見直す。

## Tomcat の設定を変更

/etc/tomcat8/server.xml を編集する。

```server.xml
...中略
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               maxThreads="450"
               URIEncoding="UTF-8" />
    <Connector port="58080" protocol="HTTP/1.1"
               proxyPort="443" redirectPort="443"
               scheme="https"
               secure="true"
               connectionTimeout="20000"
               maxThreads="450"
               URIEncoding="UTF-8" />
...中略
     <Valve className="org.apache.catalina.valves.RemoteIpValve"
           protocolHeader="x-forwarded-proto"/>

```

## Nginx、Tomcat を起動

```
sudo /etc/init.d/nginx start
sudo /etc/init.d/tomcat8 start
```

ブラウザで、https\://example.jp（自分のドメイン）に接続できればOK。

## SSL安全性チェック

[SSL Server Test](https://www.ssllabs.com/ssltest/index.html) で自分のドメインを入力し、A判定以上ならOK。

## SSL証明書の更新設定

/etc/cron.d/certbot を Nginx 用に編集する。

```:編集前
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew
```

```:編集後
0 */12 * * * root certbot -q renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx"
```

certbot の更新作業前後で、Nginx を停止する設定に変更している。