Curl/OpenSSLコマンドでTLSバージョンやCipher Suiteを指定して通信テストする方法

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

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。