[小ネタ]OpenSSLコマンドを使って色々確認する

小ネタです。

# 参考

+ [OpenSSL Manual:S client](https://wiki.openssl.org/index.php/Manual:S_client(1))
+ [openssl コマンドで SSL/TLS バージョンを指定した HTTPS 接続テストを実施する ](http://sig9.hatenablog.com/entry/2016/07/03/230000)


# 証明書発行者を確認する

```bash
$openssl s_client -connect www.yahoo.co.jp:443 < /dev/null |grep issuer
depth=1 /C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G3
verify error:num=20:unable to get local issuer certificate
verify return:0
DONE
issuer=/C=JP/O=Cybertrust Japan Co., Ltd./CN=Cybertrust Japan Public CA G3
```

発行者が Cybertrust 社だという事が分かりました。
`grep`コマンドを実行しなければ証明書の詳細が確認できます。

# SSL/TLS バージョンを指定して接続する

SSL2.0

```bash
# エラー
$openssl s_client -connect www.yahoo.co.jp:443 -ssl2 < /dev/null
CONNECTED(00000003)
37974:error:1407F0E5:SSL routines:SSL2_WRITE:ssl handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/OpenSSL098/OpenSSL098-59.60.1/src/ssl/s2_pkt.c:427:
```

TLS1.0

```bash
# 成功の場合、エラーは出ない
$openssl s_client -connect www.yahoo.co.jp:443 -tls1 < /dev/null
```

他のSSL/TLSバージョンのオプション

+ SSL2.0->-ssl2
+ SSL3.0->-ssl3
+ TLS1.0->-tls1
+ TLS1.1->-tls1_1
+ TLS1.2->-tls1_1

なお、SNI(Server Name Indication)が必要な場合、上記コマンドではエラーとなり、`-servername [domain name]`オプションの指定が必要。

```bash
$openssl s_client -connect example.com:443 -tls1_2 -servername example.com < /dev/null
```

SNI については以下が参考になりました。

[SNIで1台のサーバ上に複数のSSLサイトを運用 – 前編](https://knowledge.sakura.ad.jp/3160/)

# 暗号スイートがサポートされているか確認する

+ [理解してるつもりの SSL/TLS でも、もっと理解したら面白かった話](http://tkengo.github.io/blog/2015/12/01/https-details/)
+ [サーバーが設定しているSSL暗号を確認したい時](https://qiita.com/ionis_h/items/277430a8807ee09c8b46)

`--cipher`で暗号スイートをオプションで指定可能。
失敗の場合、以下のように「Cipher(NONE)」と表示されるよう。
また、「Secure Renegotiation IS NOT supported」と書いてある

```bash
# 失敗
$openssl s_client -connect www.google.com:443 -cipher RC4-MD5  < /dev/null
CONNECTED(00000003)
140735283146832:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:802:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 99 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1528357633
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---
```

OKのような場合以下のような感じ。
「New, TLSv1/SSLv3, Cipher is DES-CBC3-SHA」、「Secure Renegotiation IS supported」とうい感じになっている。

```bash
# OK
$openssl s_client -connect www.google.com:443 -cipher DES-CBC3-SHA

CONNECTED(00000003)
---
Certificate chain
 0 s:/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com
   i:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
 1 s:/C=US/O=Google Trust Services/CN=Google Internet Authority G3
   i:/OU=GlobalSign Root CA - R2/O=GlobalSign/CN=GlobalSign
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIEglLAdGCctAYr89nCdppZfO55jFJF8iej4E
kbtTXD3Xxxxxx
-----END CERTIFICATE-----
subject=/C=US/ST=California/L=Mountain View/O=Google LLC/CN=www.google.com
issuer=/C=US/O=Google Trust Services/CN=Google Internet Authority G3
---
No client certificate CA names sent
---
SSL handshake has read 2645 bytes and written 425 bytes
---
New, TLSv1/SSLv3, Cipher is DES-CBC3-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : DES-CBC3-SHA
    Session-ID: E967C142D8DCDD59A7F57FBA3C5AD59DE681334A926E20956204547A5E003BE9
    Session-ID-ctx:
    Master-Key: C2EDDC7D9BF2045A37074226F8CD44A29D897D10514C54459E9A8ADEB301E4F2682CA5FCCC0BDCC8C4F76999E76C18E6
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 100800 (seconds)
    TLS session ticket:
    0000 - 00 4c a3 51 8e 5e 40 35-94 15 1c 04 2c de 8f 81   .L.Q.^@5....,...
    0010 - d4 03 f1 5f a7 b7 55 e6-51 dc b6 79 68 66 5d ed   ..._..U.Q..yhf].
    0020 - 5f db 5c c1 e9 19 7b c2-d8 1c 2f 92 62 08 54 3a   _.\...{.../.b.T:
    0030 - 2f 77 44 db bc e2 48 b4-6c e8 5f e3 00 4c c1 02   /wD...H.l._..L..
    0040 - bf f6 22 d3 0d 18 80 9f-87 1b f4 ff e8 57 56 da   .."..........WV.
    0050 - 9f 1a c4 4a 6a fc c7 78-ea 9a 89 ac df 72 84 06   ...Jj..x.....r..
    0060 - 6a 3a 36 e7 b5 74 90 13-fa 35 28 d0 58 da 82 6f   j:6..t...5(.X..o
    0070 - 4c 54 0b 7d 6f ee 7a 2e-56 10 da 55 98 04 a4 76   LT.}o.z.V..U...v
    0080 - 38 f7 c4 92 38 a1 9a 3e-ab 8c 9c b3 f9 fd 83 f8   8...8..>........
    0090 - d0 df ab 8c 17 dd 3c 7d-bc 31 02 cf ea 90 28 f3   ......<}.1....(.
    00a0 - 48 31 9a d9 4a a5 9d 80-e7 da bb aa 50 53 16 f8   H1..J.......PS..
    00b0 - dc 21 27 90 a2 05 36 88-cf 20 64 6a 48 be 31 72   .!'...6.. djH.1r
    00c0 - 22 54 29 d0 3d 02 6e 78-97 d3 20 71 0e 5e 9b 8d   "T).=.nx.. q.^..

    Start Time: 1528357860
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
    
```

ある程度サーバー側でどの暗号スイートをサポートしているか判断するのは以下のスクリプトが良さげでした。

[How do I list the SSL/TLS cipher suites a particular website offers?](https://superuser.com/questions/109213/how-do-i-list-the-ssl-tls-cipher-suites-a-particular-website-offers)