レンタルサーバのssl設定

# はじめに

頼まれごとで、レンタルサーバ上にあるwebアプリケーションに対して、ssl証明書の設定をするという場面がありました。

sslの仕組みも分かっていないペーペーですが、メモを兼ねて作業ログを残します。


# 手順

こんな感じでやりました。

1. CSRファイル作成
2. CSRファイルをSSL証明書発行会社に送付(然るべきアップローダーがあるのでそこへアップ)
3. SSL証明書と、レンタルサーバのためのSSL中間証明書を受け取る
4. SSL証明書・SSL中間証明書それぞれのファイル作成
5. SSL証明書・SSL中間証明書・秘密鍵をアップする
6. SSL設定がうまくいったかを確認

# 今回の状況

- 端末OS: Mac OSX
- SSL発行元: Global Sign社
- 備考: レンタルサーバ側ドメインに対してSSLを設定(よく分かっていないので表現不適切かも)

## 1. CSRファイル作成

SSL証明書の発行は今回はGMO系列のglobal sign社にやってもらっています。
Global sign社のサイトを見ます：[Generate CSR - OpenSSL](https://support.globalsign.com/customer/portal/articles/1221018-generate-csr---openssl)

```shell-session
$ cd # ~/ へ移動
$ mkdir csr # ~/csr を作成
$ cd csr # ~/csr へ移動
$ openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privatekey.key # 鍵とかCSR作成
```

CSRっていう、おそらくSSL証明書のタネのようなものを作成します。

`openssl req`コマンドを打つと、次の表っぽいのが出てくるので、然るべき項目を埋めます。
下表の内容の他に、email, domainあたりを聞かれます。Country Nameは日本だとJPが良いと思います。

| Field	| Example |
|:-----:|:-------:|
|Country Name | US (2 Letter Code) |
State or Province | New Hampshire (Full State Name) |
| Locality | Portsmouth (Full City name) |
| Organization | GMO GlobalSign Inc (Entity's Legal Name) |
| Organizational Unit | Support (Optional, e.g. a department) |
| Common Name | www.globalsign.com (Domain or Entity name) |

参考: [Apache+OpenSSL：CSRの作成 | CSP SSL](https://cspssl.jp/support/apache/csr.php)

## 2. CSRファイルをSSL証明書発行会社に送付(然るべきアップローダーがあるのでそこへアップ)

1. を実行すると、`~/csr/CSR.csr`が作成されるので、それをSSL発行元のサイト上でアップ。

## 3. SSL証明書と、レンタルサーバのためのSSL中間証明書を受け取る

10分弱で、SSL証明書と、SSL中間証明書がメールにて受け取れます。

## 4. SSL証明書・SSL中間証明書それぞれのファイル作成

受け取ったメールのSSL証明書・SSL中間証明書を、テキストエディタでテキストファイルに書き込みます。

```shell-session
# ~/csrで作業継続
$ vim 2016-10-22.crt # SSL証明書
# <メール文面からSSL証明書の部分をコピペして保存>
$ vim 2016-10-22-mid.cer # SSL中間証明書
# <メール文面からSSL中間証明書の部分をコピペして保存>
```

ここまでで、SSL証明書・SSL中間証明書のテキストファイルが出来ました。

次に、権限変更。

```shell-session
$ chmod 400 2016-10-22.crt # SSL証明書
$ chmod 400 2016-10-22-mid.cer # 中間証明書
$ chmod 600 privatekey.key # 秘密鍵
```

権限について参考: [Apache+OpenSSL：CSRの作成 | CSP SSL](https://cspssl.jp/support/apache/csr.php)


## 5. SSL証明書・SSL中間証明書・秘密鍵をアップする

手元に、

| 役割 | ファイル名 |
|:----:|:---------:|
| SSL証明書 | 2016-10-22.crt |
| SSL中間証明書 | 2016-10-22-mid.cer |
| 秘密鍵 | privatekey.key |

があるので、レンタルサーバのSSL設定ページにて
全てアップします。

## 6. SSL設定がうまくいったかを確認

上記のことをやると、大抵うまくいくのですが、
Androidはセキュリティにシビアなようで、
Android端末のchromeでサイトを確認すると
次のような画面が出たりします(出てしまいました)。

<img width="375" alt="urlは消してます" src="https://qiita-image-store.s3.amazonaws.com/0/19990/4a8f0aa1-15fd-a288-5c0f-33f6808d0f78.jpeg">

<img width="375" alt="urlは消してます" src="https://qiita-image-store.s3.amazonaws.com/0/19990/abad04e3-c05c-f2e7-d9a3-b00452725f7b.jpeg">

...マジか。...

「Android SSL証明書 エラー」で検索してると
次の記事を発見。

[SSL中間証明書不足でAndroidがSSLエラー出してた件 | Moral Hazard!!](http://moralhazard.jp/2016/03/24/sslca/)

これによると、Apple製品上でSSLが適用されているように見えるものの、
実際にはうまくworkしていないということです。

確認方法としてはSemantec社のサイトに対象domainを打ち込むこと->
[SSL Checker | Symantec CryptoReport](https://cryptoreport.websecurity.symantec.com/checker/views/certCheck.jsp)

で、実はファイル名がおかしかったっぽいのと、
chmodで権限変更していなかったのが問題っぽかったです。
最初はSSL checkerでもnot installedなどと表示されていたのが、然るべき修正を加えることで
次の結果を得ました。

![validate_ssl.jpg](https://qiita-image-store.s3.amazonaws.com/0/19990/0ab2a60d-e91b-1181-5680-549b1e3d5dca.jpeg)

そんで、Androidユーザーの方にも問い合わせたところ、先程のようなバグは出なくなりました。

めでたしめでたし。