SSL/TLSについてまとめ2018

# はじめに
SSL/TLSについて改めて理解を深めたい思い、関連する技術についてまとめました。
本記事はTLSに関すること主題として、HTTPS、暗号化、Apache、OpenSSL等について記載しています。

SSL/TLSの通信は色々なプロトコルや暗号化方式が組み合わされ補いあってできています。暗号化の仕組みはパズルのようで面白いです。一つ一つを読み取り理解が深まるごとで、SSL/TLSって本当によくできると思いました。フレームワークの意味について考えさられます。

## HTTPSの通信
HTTPSの通信はTCP/IPプロトコルスイートとして、TCPの上層にSSL/TLSがあり、アプリケーションプロトコルのHTTPプロトコルが載って通信をしています。

コネクションとセッションは通信の概念として別になります。TCPでクライアントからWebサーバに対してコネクション(経路)が確立され、その上でセッション(ブラウザでログイン〜ログアウト)があります。


![SSLTLSまとめ6.png](https://qiita-image-store.s3.amazonaws.com/0/221759/cc06f772-4806-10ad-d909-fede4ca494ba.png)


### 概要編
- HTTPSはハイブリッド暗号方式として、共通鍵暗号と公開鍵暗号を組み合わせて通信を暗号化しています。
- 公開鍵暗号で使用するアルゴリズム(RSA)の鍵長は、CSR作成時に指定します。
- 実際の通信は、[3ウェイ・ハンドシェイク](https://ja.wikipedia.org/wiki/3%E3%82%A6%E3%82%A7%E3%82%A4%E3%83%BB%E3%83%8F%E3%83%B3%E3%83%89%E3%82%B7%E3%82%A7%E3%82%A4%E3%82%AF)の後に[TLSハンドシェイクプロトコル](https://ja.wikipedia.org/wiki/Transport_Layer_Security)のネゴシエーションが行われます。

HTTPS通信の全体概要図について以下に記載します。
![SSLTLSまとめ.png](https://qiita-image-store.s3.amazonaws.com/0/221759/5f02fd83-3f49-906d-6331-29df18bb420e.png)

### 詳細編
- SSL/TLSは「TLSハンドシェイクプロトコル」と「TLSレコードプロトコル」で構成されています。
- 「TLSハンドシェイクプロトコル」は通信に必要な鍵 (プリマスターシークレット) を鍵共有してセッションを確立します。
- 「TLSレコードプロトコル」はプリマスターシークレットを用いて通信の暗号化を行いデータを保護します。

####TLSハンドシェイクプロトコル
#### 第一フェーズ
TLSの通信で使用する共通鍵暗号等のアルゴリズムは、クライアントの環境に依存するため、クライアントが対応していない暗号アルゴリズムは使用できません。なお、暗号スイートは上から順に評価され最適な暗号アルゴリズムが選択されます。そのため、**Webサーバ側で弱い暗号化アルゴリズムを使用させないことが重要です。**
![SSLTLSまとめ2.png](https://qiita-image-store.s3.amazonaws.com/0/221759/fceaedd9-90da-f0fa-0357-c29de388e7bd.png)


#### 第二フェーズ  
クライアントは、Webサーバからサーバ証明書をダウンロードしたときに二つの処理を行っています。これら二つの処理は異なります。

- **サーバ証明書の完全性をMD(メッセージダイジェスト)で検証する**
- **サーバ証明書の正真性をルートCAで検証する**

![SSLTLSまとめ3.png](https://qiita-image-store.s3.amazonaws.com/0/221759/c3196e57-280d-6d12-592b-7b12df664da9.png)


#### 第三フェーズ
HTTPSの通信で共有する一時的な鍵をセッション鍵と呼びます。セッション鍵は一時的な鍵であるため、仮に盗まれても以降の通信に影響はありません。逆に、秘密鍵が盗まれた場合は過去の通信まで複合化される恐れがあります。
![SSLTLSまとめ4.png](https://qiita-image-store.s3.amazonaws.com/0/221759/4b609057-4dcc-6438-a144-0329c6e59d89.png)

#### 第四フェーズ
TLSハンドシェイクプロトコル終了後、TLSレコードプロトコルでアプリケーションデータを暗号化して通信を行います。
![SSLTLSまとめ5.png](https://qiita-image-store.s3.amazonaws.com/0/221759/60116c6a-7558-5263-16c5-bbe6e2e44714.png)

#### TLSレコードプロトコル
TLSレコードプロトコルでは通信中のデータが改ざんされていなことを確認するための仕組みとして、メッセージ認証コードを使用しています。まず、メッセージをフラグメントという単位で分割して圧縮を行いメッセージ認証コードを付加します。次に、圧縮したフラグメントとメッセージ認証コードを合わせて共通鍵暗号で暗号化します。

## ApacheのHTTPS設定
ApacheとOpenSSLを使用した自己署名による環境構築手順について記載します。

環境：Apache + OpenSSL

(※)本記事では以下としています。

server.key：秘密鍵
server.csr：CSR
server.crt：サーバ証明書

### CSR作成

- 秘密鍵の作成  
   `# openssl genrsa -aes256 -out server.key 2048`


```bash
Generating RSA private key, 2048 bit long modulus
..............+++
..............................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
```
opensslコマンドのオプションのgenrsaは公開鍵暗号の[RSA](https://ja.wikipedia.org/wiki/RSA%E6%9A%97%E5%8F%B7)、2048は鍵長2048ビットを意味する。また、aes256は公開鍵暗号で使用する秘密鍵を共通鍵暗号の[AES](https://ja.wikipedia.org/wiki/Advanced_Encryption_Standard)で鍵長256ビットを意味する。なお、ここで入力しているパスワードは秘密鍵に対するパスワードである。秘密鍵に対する暗号化を行うとで、apacheを再起動するときにパスフレーズが求められる。秘密鍵に暗号化したパスワードは後で解除することができる。

**秘密鍵作成時のポイント**

- [x] 秘密鍵に対する公開鍵暗号アルゴリズムの鍵長は2048ビット以上を推奨
- [x] 秘密鍵は安全なところで作成し、不要な鍵は削除すること
- [x] 秘密鍵の権限は400として所有者はrootにすること


- CSRの作成  
   `# openssl req -new -key server.key -out server.csr`

```bash
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:Tokyo
Locality Name (eg, city) [Default City]:Chuo-Ku
Organization Name (eg, company) [Default Company Ltd]:test.com
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:www.test.com
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
```

### サーバ証明書作成(自己証明書)

- サーバ証明書の作成(自己証明書)  
   `# openssl x509 -in server.csr -days 365000 -req -signkey server.key > server.crt`

```bash
Signature ok
subject=/C=JP/ST=Tokyo/L=Chuo-Ku/O=test.com/CN=www.test.com
Getting Private key
Enter pass phrase for server.key:
```
自己署名後、秘密鍵(server.key)とサーバ証明書(server.crt)を所定のディレクトリに格納し、ssl.confでパスを指定して再起動するとHTTPSでアクセスできるようになる。

(※)サーバ証明書を第三者機関に発行してもらう場合は、作成したCSRを第三者機関に送信して認証後にサーバ証明書がメールなどで送られてきます。そしたら、同じように秘密鍵(server.key)とサーバ証明書(server.crt)をssl.confでのパスを指定して再起動するとHTTPSでアクセスできるようになります。

## その他参考
### OpenSSL

- Opensslの入手
OpenSSLは各ディストリビューターで用意された元々OSに内臓しているものと、[本家のダウンロードサイト](https://www.openssl.org/source/)で提供しているソースに分類できます。また、[本家のダウンロードサイト](https://www.openssl.org/source/)で提供しているソースのOpenSSLは、通常版とfips版の二種類があります。ファイル名にfipsが付いているのものはNISTが発行している標準規格で、軍事以外全ての政府機関及び請負業者による利用を目的として米国連邦政府が開発した公式発表の情報処理標準規格になります。


- FIPS 140-2
[NISTのサイト](https://csrc.nist.gov/projects/cryptographic-module-validation-program/validated-modules/search)より、opensslで検索すると「FIPS 140-2」で認定されていることが確認できます。なお、OpenSSLはFIPS 140-2において承認された初めてのオープンソースプログラムのようです。

![SSL005.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/9740c20f-a85a-be54-cf32-d4c162c476f3.jpeg)

- OpenSSLの選定  
日本国内のシステムへの導入であれば、要件がない限りfips版のOpenSSLは使われていないと思います。
LTSリリース(OpenSSL 1.1.0)は約5年間サポートされ、非LTSリリース(OpenSSL 1.0.2)は少なくとも2年間サポートされることを考慮して、導入時のタイミングでシステムに最適なものを選定するのがベストだと思います。なお、現在のOpenSSL 1.1.0とOpenSSL 1.0.2については[Release Strategy](https://www.openssl.org/policies/releasestrat.html)のとおりに、新しい機能を除けば一般的な運用で差異はないです。

>1.0.2aなどのレターリリースでは、バグやセキュリティの修正が含まれていますが、新機能は含まれていません。1.1.0対1.1.1など、最後の数字を変更するマイナーリリースでは、新しい機能が含まれている可能性がありますが、バイナリ互換性を損なうことはありません。つまり、1.1.0にコンパイルされ、動的にリンクされたアプリケーションは、共有ライブラリが1.1.1に更新されたときに再コンパイルする必要はありません。

- OpenSSLのインストール   
以前書いた[Apache2.4インストール手順](https://qiita.com/Brutus/items/47784fe1b479ba7d445b#openssl)を参照。

### opensslコマンド
- 秘密鍵の内容を確認  
 `# openssl rsa -text -noout -in server.key`
- 秘密鍵のパスフレーズを解除  
 `# openssl rsa -in server.key -out server.key`
- CSRの内容を確認  
 `# openssl req -text -noout -in  server.csr`
- 証明書の内容を確認  
 `# openssl x509 -text -noout -in server.crt`
- opensslで疎通確認  
 `# openssl s_client -connect localhost:443`
- 暗号スイートの確認  
 `# openssl ciphers -v`

*出力例*

```bash
[root@localhost ~]# openssl ciphers -v
# 左から鍵交換/プロトコル/認証/暗号化/ハッシュ関数
ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(256) Mac=AEAD
ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(256) Mac=AEAD
ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA384
ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA384
ECDHE-RSA-AES256-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(256)  Mac=SHA1
ECDHE-ECDSA-AES256-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(256) Mac=AEAD
DHE-RSA-AES256-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA256
DHE-DSS-AES256-SHA256   TLSv1.2 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA256
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1
DHE-RSA-CAMELLIA256-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(256) Mac=SHA1
DHE-DSS-CAMELLIA256-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(256) Mac=SHA1
ECDH-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(256) Mac=AEAD
ECDH-RSA-AES256-SHA384  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(256)  Mac=SHA384
ECDH-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256)  Mac=SHA384
ECDH-RSA-AES256-SHA     SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(256)  Mac=SHA1
ECDH-ECDSA-AES256-SHA   SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(256)  Mac=SHA1
AES256-GCM-SHA384       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(256) Mac=AEAD
AES256-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA256
AES256-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(256)  Mac=SHA1
CAMELLIA256-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(256) Mac=SHA1
PSK-AES256-CBC-SHA      SSLv3 Kx=PSK      Au=PSK  Enc=AES(256)  Mac=SHA1
ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AESGCM(128) Mac=AEAD
ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AESGCM(128) Mac=AEAD
ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA256
ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA256
ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
ECDHE-ECDSA-AES128-SHA  SSLv3 Kx=ECDH     Au=ECDSA Enc=AES(128)  Mac=SHA1
DHE-DSS-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=DSS  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH       Au=RSA  Enc=AESGCM(128) Mac=AEAD
DHE-RSA-AES128-SHA256   TLSv1.2 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA256
DHE-DSS-AES128-SHA256   TLSv1.2 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA256
DHE-RSA-AES128-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(128)  Mac=SHA1
DHE-DSS-AES128-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(128)  Mac=SHA1
DHE-RSA-SEED-SHA        SSLv3 Kx=DH       Au=RSA  Enc=SEED(128) Mac=SHA1
DHE-DSS-SEED-SHA        SSLv3 Kx=DH       Au=DSS  Enc=SEED(128) Mac=SHA1
DHE-RSA-CAMELLIA128-SHA SSLv3 Kx=DH       Au=RSA  Enc=Camellia(128) Mac=SHA1
DHE-DSS-CAMELLIA128-SHA SSLv3 Kx=DH       Au=DSS  Enc=Camellia(128) Mac=SHA1
ECDH-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AESGCM(128) Mac=AEAD
ECDH-RSA-AES128-SHA256  TLSv1.2 Kx=ECDH/RSA Au=ECDH Enc=AES(128)  Mac=SHA256
ECDH-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128)  Mac=SHA256
ECDH-RSA-AES128-SHA     SSLv3 Kx=ECDH/RSA Au=ECDH Enc=AES(128)  Mac=SHA1
ECDH-ECDSA-AES128-SHA   SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=AES(128)  Mac=SHA1
AES128-GCM-SHA256       TLSv1.2 Kx=RSA      Au=RSA  Enc=AESGCM(128) Mac=AEAD
AES128-SHA256           TLSv1.2 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA256
AES128-SHA              SSLv3 Kx=RSA      Au=RSA  Enc=AES(128)  Mac=SHA1
SEED-SHA                SSLv3 Kx=RSA      Au=RSA  Enc=SEED(128) Mac=SHA1
CAMELLIA128-SHA         SSLv3 Kx=RSA      Au=RSA  Enc=Camellia(128) Mac=SHA1
PSK-AES128-CBC-SHA      SSLv3 Kx=PSK      Au=PSK  Enc=AES(128)  Mac=SHA1
ECDHE-RSA-DES-CBC3-SHA  SSLv3 Kx=ECDH     Au=RSA  Enc=3DES(168) Mac=SHA1
ECDHE-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH     Au=ECDSA Enc=3DES(168) Mac=SHA1
EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
ECDH-RSA-DES-CBC3-SHA   SSLv3 Kx=ECDH/RSA Au=ECDH Enc=3DES(168) Mac=SHA1
ECDH-ECDSA-DES-CBC3-SHA SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=3DES(168) Mac=SHA1
DES-CBC3-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=3DES(168) Mac=SHA1
IDEA-CBC-SHA            SSLv3 Kx=RSA      Au=RSA  Enc=IDEA(128) Mac=SHA1
PSK-3DES-EDE-CBC-SHA    SSLv3 Kx=PSK      Au=PSK  Enc=3DES(168) Mac=SHA1
KRB5-IDEA-CBC-SHA       SSLv3 Kx=KRB5     Au=KRB5 Enc=IDEA(128) Mac=SHA1
KRB5-DES-CBC3-SHA       SSLv3 Kx=KRB5     Au=KRB5 Enc=3DES(168) Mac=SHA1
KRB5-IDEA-CBC-MD5       SSLv3 Kx=KRB5     Au=KRB5 Enc=IDEA(128) Mac=MD5
KRB5-DES-CBC3-MD5       SSLv3 Kx=KRB5     Au=KRB5 Enc=3DES(168) Mac=MD5
ECDHE-RSA-RC4-SHA       SSLv3 Kx=ECDH     Au=RSA  Enc=RC4(128)  Mac=SHA1
ECDHE-ECDSA-RC4-SHA     SSLv3 Kx=ECDH     Au=ECDSA Enc=RC4(128)  Mac=SHA1
ECDH-RSA-RC4-SHA        SSLv3 Kx=ECDH/RSA Au=ECDH Enc=RC4(128)  Mac=SHA1
ECDH-ECDSA-RC4-SHA      SSLv3 Kx=ECDH/ECDSA Au=ECDH Enc=RC4(128)  Mac=SHA1
RC4-SHA                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=SHA1
RC4-MD5                 SSLv3 Kx=RSA      Au=RSA  Enc=RC4(128)  Mac=MD5
PSK-RC4-SHA             SSLv3 Kx=PSK      Au=PSK  Enc=RC4(128)  Mac=SHA1
KRB5-RC4-SHA            SSLv3 Kx=KRB5     Au=KRB5 Enc=RC4(128)  Mac=SHA1
KRB5-RC4-MD5            SSLv3 Kx=KRB5     Au=KRB5 Enc=RC4(128)  Mac=MD5
```

### SSL/TLSに関する設定(Apache)
Apacheを例にSSL/TLSに関する重要な設定項目について記載します。
設定値の詳細は、[Apache Modulemod_ssl](https://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslciphersuite)で確認できます。

- SSLCipherSuite  
使用する暗号スイートを定義します。 後述するSSLHonorCipherOrderを有効にした上で組み合わせて行うことで、使用する暗号アルゴリズムをコントロールできます。

```bash
# Apache2.4のデフォルト値
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4:!3DES
# IPAの設定例(推奨セキュリティ型の設定例（基本 46）)
SSLCipherSuite DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-CAMELLIA128-SHA:DHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:CAMELLIA128-SHA:AES128-SHA:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-RSA-CAMELLIA256-SHA:DHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:CAMELLIA256-SHA:AES256-SHA
```



| タグ       |    説明    |
|:-----------------|:------------------|
| 鍵交換アルゴリズム：	|		|
| kRSA	|	RSA鍵交換	|
| kDHr	|	RSAキーを使用したDiffie-Hellman鍵交換	|
| kDHd	|	DSAキーによるDiffie-Hellman鍵交換	|
| kEDH	|	エフェメラル（temp.key）Diffie-Hellman鍵交換（no cert）	|
| kSRP	|	セキュアリモートパスワード（SRP）鍵交換	|
| 認証アルゴリズム：	|		|
| aNULL	|	認証なし	|
| aRSA	|	RSA認証	|
| aDSS	|	DSS認証	|
| aDH	|	Diffie-Hellman認証	|
| 暗号符号化アルゴリズム：	|		|
| eNULL	|	暗号化なし	|
| NULL	|	eNULLのエイリアス	|
| AES	|	AES暗号化	|
| DES	|	DES暗号化	|
| 3DES	|	トリプルDES暗号化	|
| RC4	|	RC4暗号化	|
| RC2	|	RC2暗号化	|
| IDEA	|	IDEA暗号化	|
| MACダイジェストアルゴリズム：	|		|
| MD5	|	MD5ハッシュ関数	|
| SHA1	|	SHA1ハッシュ関数	|
| SHA	|	SHA1のエイリアス	|
| SHA256	|	SHA256ハッシュ関数	|
| SHA384	|	SHA3??84ハッシュ関数	|
| エイリアス：	|		|
| SSLv3	|	すべてのSSLバージョン3.0の暗号	|
| TLSv1	|	すべてのTLSバージョン1.0暗号	|
| EXP	|	すべてのエクスポート暗号	|
| EXPORT40	|	すべての40ビットエクスポート暗号のみ	|
| EXPORT56	|	すべての56ビットエクスポート暗号のみ	|
| LOW	|	すべての低強度暗号（エクスポートなし、単一DES）	|
| MEDIUM	|	128ビット暗号化を持つすべての暗号	|
| HIGH	|	トリプルDESを使用するすべての暗号	|
| RSA	|	RSA鍵交換を使用するすべての暗号	|
| DH	|	Diffie-Hellman鍵交換を使用するすべての暗号	|
| EDH	|	Ephemeral Diffie-Hellman鍵交換を使用するすべての暗号	|
| ECDH	|	楕円曲線Diffie-Hellman鍵交換	|
| ADH	|	匿名Diffie-Hellman鍵交換を使用するすべての暗号	|
| AECDH	|	匿名楕円曲線を使用するすべての暗号Diffie-Hellman鍵交換	|
| SRP	|	セキュアリモートパスワード（SRP）鍵交換を使用するすべての暗号	|
| DSS	|	DSS認証を使用するすべての暗号	|
| ECDSA	|	ECDSA認証を使用するすべての暗号	|
| aNULL	|	認証を使用しないすべての暗号	|

- SSLHonorCipherOrder   
暗号化方式の決定順序をクライアントではなくサーバ優先とします。 

```bash
# Apache2.4のデフォルト値
SSLHonorCipherOrder on
```

- SSLProtocol   
使用するプロトコルを指定できます。 デフォルトはSSLv3無効で他のプロトコルは有効を意味します。セキュリティを高める場合はTLSv1.2が望ましいですが、幅広いブラウザに対応するためにはTLS 1.1とTLS 1.2を許可したほうが無難です。

```bash
# 以下の場合、TLS 1.1とTLS 1.2を許可する
SSLProtocol all -SSLv2 -SSLv3 -TLSv1
```


- Strict-Transport-Security   
常時HTTPS化の時代を考えると必須な設定値です。以下の設定値を有効にすることで、レスポンスヘッダに「Strict-Transport-Security」を付加し、クライアントに次回からHTTPSでアクセスするように伝えることができます。

```bash
# 以下の場合、365 日（31,536,000 秒）の有効期間を設定する
Header always set Strict-Transport-Security  "max-age=31536000"
```

### クライアント設定
以下はWindows端末の例

- ルートCAの確認
IEの場合は、インターネットオプションからコンテンツタブの「証明書」をクリックする。Chromeの場合は、詳細設定の「証明書の管理」をクリックする。
証明書から、信頼されたルート証明機関タブをクリックする。
![SSL000.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/d8657366-e071-2f7b-307a-46db05016e94.jpeg)

- プロトコルの確認
IEの場合は、インターネットオプションからコンテンツタブの「詳細設定」をクリックする。Chromeの場合は、詳細設定のシステムから「プロキシ設定を開く」
![SSL002.JPG](https://qiita-image-store.s3.amazonaws.com/0/221759/4f84c9f4-0ea4-34f4-d4b1-0812e9005c66.jpeg)

### サーバ証明書
サーバ証明書は以下の三種類に分類できます。

-  DV 証明書(Domain Validation)  
導入コストは安いが企業の実在性証明がないため、スタートアップの企業には向いていない。
-  OV 証明書(Organization Validation)  
企業の実在性証明があるため、多く利用されているがアドレスバーは緑色にならない。
-  EV 証明書(Extended Validation)   
企業の実在性証明があり、かつ、厳格な認証が行われ、アドレスバーは緑色になる。しかし、導入コストは高い。

### SSL Server Test
[SSL Server Test](https://www.ssllabs.com/ssltest/)で検証したいURLを入力すると、SSL/TLSの評価をしてくれます。外部に公開前の動作確認にいいと思います。


### 参考資料
SSL/TLSに係る参考資料について記載します。

- [SSL/TLS 暗号設定ガイドライン](https://www.ipa.go.jp/files/000045645.pdf)
IPAが公開している資料であり、2015 年 3 月時点における、SSL/TLS 通信での安全性と可用性（相互接続性）のバランスを踏まえた SSL/TLS サーバの設定方法が記載されています。

- [電子政府推奨暗号リスト](http://www.cryptrec.go.jp/list/cryptrec-ls-0001-2016.pdf) 
 CRYPTRECが推奨している暗号化方式のリストです。電子政府が使用する暗号アルゴリズムの指針になっています。

## さいごに
さいごまで読んでいただきありがとうございました。