LinuxのCurlコマンドとOpenSSLコマンドを使ってTLS関連の通信テストをおこなうメモです。
目次
利用可能なCipher Suiteを確認する方法
openssl ciphers
コマンドを実行します。
$ openssl ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-SHA:RSA-PSK-AES256-GCM-SHA384:DHE-PSK-AES256-GCM-SHA384:RSA-PSK-CHACHA20-POLY1305:DHE-PSK-CHACHA20-POLY1305:ECDHE-PSK-CHACHA20-POLY1305:AES256-GCM-SHA384:PSK-AES256-GCM-SHA384:PSK-CHACHA20-POLY1305:RSA-PSK-AES128-GCM-SHA256:DHE-PSK-AES128-GCM-SHA256:AES128-GCM-SHA256:PSK-AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:ECDHE-PSK-AES256-CBC-SHA384:ECDHE-PSK-AES256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:SRP-AES-256-CBC-SHA:RSA-PSK-AES256-CBC-SHA384:DHE-PSK-AES256-CBC-SHA384:RSA-PSK-AES256-CBC-SHA:DHE-PSK-AES256-CBC-SHA:AES256-SHA:PSK-AES256-CBC-SHA384:PSK-AES256-CBC-SHA:ECDHE-PSK-AES128-CBC-SHA256:ECDHE-PSK-AES128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:SRP-AES-128-CBC-SHA:RSA-PSK-AES128-CBC-SHA256:DHE-PSK-AES128-CBC-SHA256:RSA-PSK-AES128-CBC-SHA:DHE-PSK-AES128-CBC-SHA:AES128-SHA:PSK-AES128-CBC-SHA256:PSK-AES128-CBC-SHA $
「-v」オプションを付けると詳細に表示されます。
$ openssl ciphers -v TLS_AES_256_GCM_SHA384 TLSv1.3 Kx=any Au=any Enc=AESGCM(256) Mac=AEAD TLS_CHACHA20_POLY1305_SHA256 TLSv1.3 Kx=any Au=any Enc=CHACHA20/POLY1305(256) Mac=AEAD TLS_AES_128_GCM_SHA256 TLSv1.3 Kx=any Au=any Enc=AESGCM(128) Mac=AEAD ECDHE-ECDSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(256) Mac=AEAD ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD DHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(256) Mac=AEAD ECDHE-ECDSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=ECDSA Enc=CHACHA20/POLY1305(256) Mac=AEAD ECDHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=ECDH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD DHE-RSA-CHACHA20-POLY1305 TLSv1.2 Kx=DH Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD ECDHE-ECDSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AESGCM(128) Mac=AEAD ECDHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(128) Mac=AEAD DHE-RSA-AES128-GCM-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AESGCM(128) Mac=AEAD ECDHE-ECDSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA384 ECDHE-RSA-AES256-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA384 DHE-RSA-AES256-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(256) Mac=SHA256 ECDHE-ECDSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA256 ECDHE-RSA-AES128-SHA256 TLSv1.2 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA256 DHE-RSA-AES128-SHA256 TLSv1.2 Kx=DH Au=RSA Enc=AES(128) Mac=SHA256 ECDHE-ECDSA-AES256-SHA TLSv1 Kx=ECDH Au=ECDSA Enc=AES(256) Mac=SHA1 ECDHE-RSA-AES256-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(256) Mac=SHA1 DHE-RSA-AES256-SHA SSLv3 Kx=DH Au=RSA Enc=AES(256) Mac=SHA1 ECDHE-ECDSA-AES128-SHA TLSv1 Kx=ECDH Au=ECDSA Enc=AES(128) Mac=SHA1 ECDHE-RSA-AES128-SHA TLSv1 Kx=ECDH Au=RSA Enc=AES(128) Mac=SHA1 DHE-RSA-AES128-SHA SSLv3 Kx=DH Au=RSA Enc=AES(128) Mac=SHA1 RSA-PSK-AES256-GCM-SHA384 TLSv1.2 Kx=RSAPSK Au=RSA Enc=AESGCM(256) Mac=AEAD DHE-PSK-AES256-GCM-SHA384 TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESGCM(256) Mac=AEAD RSA-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=RSAPSK Au=RSA Enc=CHACHA20/POLY1305(256) Mac=AEAD DHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=DHEPSK Au=PSK Enc=CHACHA20/POLY1305(256) Mac=AEAD ECDHE-PSK-CHACHA20-POLY1305 TLSv1.2 Kx=ECDHEPSK Au=PSK Enc=CHACHA20/POLY1305(256) Mac=AEAD AES256-GCM-SHA384 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(256) Mac=AEAD PSK-AES256-GCM-SHA384 TLSv1.2 Kx=PSK Au=PSK Enc=AESGCM(256) Mac=AEAD PSK-CHACHA20-POLY1305 TLSv1.2 Kx=PSK Au=PSK Enc=CHACHA20/POLY1305(256) Mac=AEAD RSA-PSK-AES128-GCM-SHA256 TLSv1.2 Kx=RSAPSK Au=RSA Enc=AESGCM(128) Mac=AEAD DHE-PSK-AES128-GCM-SHA256 TLSv1.2 Kx=DHEPSK Au=PSK Enc=AESGCM(128) Mac=AEAD AES128-GCM-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AESGCM(128) Mac=AEAD PSK-AES128-GCM-SHA256 TLSv1.2 Kx=PSK Au=PSK Enc=AESGCM(128) Mac=AEAD AES256-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA256 AES128-SHA256 TLSv1.2 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA256 ECDHE-PSK-AES256-CBC-SHA384 TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(256) Mac=SHA384 ECDHE-PSK-AES256-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(256) Mac=SHA1 SRP-RSA-AES-256-CBC-SHA SSLv3 Kx=SRP Au=RSA Enc=AES(256) Mac=SHA1 SRP-AES-256-CBC-SHA SSLv3 Kx=SRP Au=SRP Enc=AES(256) Mac=SHA1 RSA-PSK-AES256-CBC-SHA384 TLSv1 Kx=RSAPSK Au=RSA Enc=AES(256) Mac=SHA384 DHE-PSK-AES256-CBC-SHA384 TLSv1 Kx=DHEPSK Au=PSK Enc=AES(256) Mac=SHA384 RSA-PSK-AES256-CBC-SHA SSLv3 Kx=RSAPSK Au=RSA Enc=AES(256) Mac=SHA1 DHE-PSK-AES256-CBC-SHA SSLv3 Kx=DHEPSK Au=PSK Enc=AES(256) Mac=SHA1 AES256-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(256) Mac=SHA1 PSK-AES256-CBC-SHA384 TLSv1 Kx=PSK Au=PSK Enc=AES(256) Mac=SHA384 PSK-AES256-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=AES(256) Mac=SHA1 ECDHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA256 ECDHE-PSK-AES128-CBC-SHA TLSv1 Kx=ECDHEPSK Au=PSK Enc=AES(128) Mac=SHA1 SRP-RSA-AES-128-CBC-SHA SSLv3 Kx=SRP Au=RSA Enc=AES(128) Mac=SHA1 SRP-AES-128-CBC-SHA SSLv3 Kx=SRP Au=SRP Enc=AES(128) Mac=SHA1 RSA-PSK-AES128-CBC-SHA256 TLSv1 Kx=RSAPSK Au=RSA Enc=AES(128) Mac=SHA256 DHE-PSK-AES128-CBC-SHA256 TLSv1 Kx=DHEPSK Au=PSK Enc=AES(128) Mac=SHA256 RSA-PSK-AES128-CBC-SHA SSLv3 Kx=RSAPSK Au=RSA Enc=AES(128) Mac=SHA1 DHE-PSK-AES128-CBC-SHA SSLv3 Kx=DHEPSK Au=PSK Enc=AES(128) Mac=SHA1 AES128-SHA SSLv3 Kx=RSA Au=RSA Enc=AES(128) Mac=SHA1 PSK-AES128-CBC-SHA256 TLSv1 Kx=PSK Au=PSK Enc=AES(128) Mac=SHA256 PSK-AES128-CBC-SHA SSLv3 Kx=PSK Au=PSK Enc=AES(128) Mac=SHA1 $
TLSバージョンを指定してCurlで接続可否を確認する
この章ではTLSバージョンを固定して通信する方法を掲載しています。たとえばTLSv1.0で通信させたい場合、--tlsv1.0
オプションだけだとネゴシエーションによってTLSv1.2などが選択されてしまうため、--tlsmax 1.0
でバージョンの上限を指定しTLSv1.0に固定させるという方法にしています。
TLSv1.0
--tlsv1.0
と--tls-max 1.0
を組み合わせることによってTLSv1.0に固定して接続可否を確認する。
$ curl --tlsv1.0 --tls-max 1.0 https://example.com
TLSv1.1
--tlsv1.1
と--tls-max 1.1
を組み合わせることによってTLSv1.1に固定して接続可否を確認する。
$ curl --tlsv1.1 --tls-max 1.1 https://example.com
TLSv1.2
--tlsv1.2
と--tls-max 1.2
を組み合わせることによってTLSv1.2に固定して接続可否を確認する。
$ curl --tlsv1.2 --tls-max 1.2 https://example.com
TLSv1.3
--tlsv1.3
と--tls-max 1.3
を組み合わせることによってTLSv1.3に固定して接続可否を確認する。
$ curl --tlsv1.3 --tls-max 1.3 https://example.com
Cipher Suiteを指定して動作を確認する
利用可能なCipher Suiteは冒頭の「利用可能なCipher Suiteを確認する方法」で確認できます。
CurlコマンドとOpenSSLコマンドの両方の確認方法を掲載します。TLSv1.3とそれ以外ではCIpher Suiteの指定方法が異なるので注意が必要です。
Curlを使う場合(TLSv1.0/1.1/1.2)
TLSv1.0/1.1/1.2とTLSv1.3ではCipher Suiteの指定方法が異なるので注意してください。
TLSv1.0/1.1/1.2では--ciphers
オプションでCipherを指定します。
curl --ciphers ECDHE-ECDSA-AES128-SHA256 https://example.com
動作テストする際はTLSバージョンも指定した方が良いでしょう。
curl --tlsv1.2 --tls-max 1.2 --ciphers ECDHE-ECDSA-AES128-SHA256 https://example.com
Curlを使う場合(TLSv1.3)
TLSv1.3では--tls13-ciphers
オプションを使います。
curl --tls13-ciphers TLS_AES_256_GCM_SHA384 https://example.com
動作テストする際はTLSバージョンも指定した方が良いでしょう。
curl --tlsv1.3 --tls-max 1.3 --tls13-ciphers TLS_AES_256_GCM_SHA384 https://example.com
OpenSSLを使う場合(TLSv1.0/1.1/1.2)
TLSv1.0/1.1/1.2とTLSv1.3ではCipher Suiteの指定方法が異なるので注意してください。
TLSv1.0/1.1/1.2では--cipher
オプションでCipherを指定します。
openssl s_client -connect example.com:443 -cipher ECDHE-ECDSA-AES128-SHA256 </dev/null
動作テストする際はTLSバージョンも指定した方が良いでしょう。
OpenSSL/TLSv1.0 指定
openssl s_client -connect example.com:443 -tls1 -cipher ECDHE-ECDSA-AES128-SHA256 </dev/null
OpenSSL/TLSv1.1 指定
openssl s_client -connect example.com:443 -tls1_1 -cipher ECDHE-ECDSA-AES128-SHA256 </dev/null
OpenSSL/TLSv1.2 指定
openssl s_client -connect example.com:443 -tls1_2 -cipher ECDHE-ECDSA-AES128-SHA256 </dev/null
OpenSSLを使う場合(TLSv1.3)
TLSv1.3では-ciphersuites
オプションでCipherを指定します。
openssl s_client -connect example.com:443 -ciphersuites TLS_AES_128_GCM_SHA256 </dev/null
動作テストする際はTLSバージョンも指定した方が良いでしょう。
openssl s_client -connect example.com:443 -tls1_3 -ciphersuites TLS_AES_128_GCM_SHA256 </dev/null
コマンドで複数のCipher Suiteを一気に試す方法
最初に使いたいCipher Suiteの一覧を環境変数(CIPHERS)に設定しておきます。特定のCipher Suiteだけに絞りたいのか、利用可能なすべてのCipher Suitを使いたいのか、それによって設定方法が変わります。
特定のCuipher Suiteだけ環境変数に設定する場合
CIPHERS=" TLS_AES_256_GCM_SHA384 TLS_CHACHA20_POLY1305_SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 "
利用可能な全Cipher Suiteを環境変数に設定する場合
CIPHERS=$(openssl ciphers | sed 's/:/\n/g')
Curlコマンドで複数のCipher Suiteの利用可否を一気に確認する
curlでは応答の「SSL connection using XXX」でTLSバージョンとCipher Suiteが確認できますので、これを一括でチェックする方法を掲載します。
TLSv1.0/TLSv1.1/TLSv1.2
TLSバージョンは適宜変更してください。TLSバージョンを指定しなくても動きますが、動作テストの場合はTLSバージョンを指定した方が良いでしょう。
for cipher in $CIPHERS; do echo ===== $cipher =====; curl -v --tlsv1.2 --tls-max 1.2 --ciphers $cipher https://example.com 2>&1 | grep 'SSL connection using'; done
TLSv1.3
既に解説しているとおり、TLSv1.3の場合はオプションが異なります。
for cipher in $CIPHERS; do echo ===== $cipher =====; curl -v --tlsv1.3 --tls-max 1.3 --tls13-ciphers $cipher https://example.com 2>&1 | grep 'SSL connection using'; done
OpeSSLコマンドで複数のCipher Suiteの利用可否を一気に確認する
OpenSSLコマンドでは応答の「Cipher is XXX」でTLSバージョンとCipher Suiteが確認できますので、これを一括でチェックする方法を掲載します。
TLSv1.0/TLSv1.1/TLSv1.2
TLSバージョンは適宜変更してください。TLSバージョンを指定しなくても動きますが、動作テストの場合はTLSバージョンを指定した方が良いでしょう。
for cipher in $CIPHERS; do echo ===== $cipher =====; openssl s_client -connect example.com:443 -tls1_2 -cipher $cipher &1 | grep 'Cipher is'; done
TLSv1.3
既に解説しているとおり、TLSv1.3の場合はオプションが異なります。
for cipher in $CIPHERS; do echo ===== $cipher =====; openssl s_client -connect example.com:443 -tls1_3 -ciphersuites $cipher &1 | grep 'Cipher is'; done
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント