PR

SSL/TLS通信で使用されているCipher Suite(サイファースイート)を確認する方法

ここではWebサイトなどで使用されているSSL/TLS通信の通信データの暗号化、サーバーの認証、データの改ざん検知に使用される複数の暗号アルゴリズムやプロトコルの組み合わせについて、具体的に確認する方法をお伝えします。

スポンサーリンク

Apacheでの暗号化スイートの設定部分

apacheの設定ファイルは、/etc/httpd/conf.d/ssl.confなどです。このファイルの

SSLCipherSuite 

の部分に暗号化アルゴリズムの指定を行います。

こちらの設定ですが、正直なところ何を設定して良いのかよくわかりません。よくわからないからと言って、適当に設定する訳にはいきませんので、IPAから出ているガイドラインに沿って設定します。ガイドラインの詳細はこちらをご確認いただくとして、私は「高セキュリティ型の設定」を選択しました。具体的な設定例は以下になります。

SSLCipherSuite "ECDHE+AESGCM:DHE+aRSA+AESGCM:ECDHE+AESCCM:DHE+aRSA+AESCCM:+AESCCM8:ECDHE+CH
ACHA20:DHE+aRSA+CHACHA20:+AES128:+DHE"
SSLCipherSuite TLSv1.3    "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AE
S_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256"

一行目はTLS1.2の設定で、二行目はTLS1.3の設定になります。

こちらの設定を実施後、apacheのサービスを再起動(再読み込み)します。

nmapコマンドで使用できる暗号化スイートの確認方法

nmapコマンドで指定したサイト(FQDN)で使用できる暗号化スイートを確認するには以下のコマンドを実行します。

もしnmapのコマンドがインストールされていなければ、以下のコマンドでインストールします。

例えば、dassyi.comのnmapのコマンドの実行結果は、以下のように表示されます。(一部省略しています)

PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 (dh 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CCM_8 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CCM (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256 (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_RSA_WITH_ARIA_256_GCM_SHA384 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CCM_8 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CCM (rsa 2048) - A
|       TLS_RSA_WITH_ARIA_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 (rsa 2048) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 (dh 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CCM_8 (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CCM (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (ecdh_x25519) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 (dh 2048) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_256_CCM_8 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CCM (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_AES_128_CBC_SHA (dh 2048) - A
|       TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA (dh 2048) - A
|       TLS_RSA_WITH_CAMELLIA_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_CAMELLIA_128_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_SEED_CBC_SHA (dh 2048) - A
|       TLS_RSA_WITH_SEED_CBC_SHA (rsa 2048) - A
|       TLS_DHE_RSA_WITH_AES_256_CBC_SHA (dh 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.3: 
|     ciphers: 
|       TLS_AKE_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_AKE_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|       TLS_AKE_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|     cipher preference: server
|_  least strength: A

ちなみに右端のAと表示されているのは暗語化スイートの強度で、Aが一番強くてFが一番弱いそうです。

opensslコマンドによる確認方法

opensslコマンドで使用できる暗号化スイートを確認するには以下のコマンドを実行します。こちらはローカルサーバの内容を確認するコマンドになります。

opensslコマンドで、実際に暗号化スイートを指定してウェブサーバへアクセスするには以下のコマンドを実行します。

> s_client -connect サイトのFQDN:443 -cipher 使用する暗号化スイート -tlsのバージョン

上記コマンドを実行すると、暗号化スイートが使える場合は、ズラズラと大量に文字列が表示され、「SSL-Session」の部分を確認します。指定の暗号化スイートが使用できた場合は、以下のように表示されます。(Protocol と Cipherの表示内容を確認)

SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : AES128-GCM-SHA256
    Session-ID: 267589DB6419BFAE0C3DC90932794C
    Session-ID-ctx:
    Master-Key: 6BA1A755D3767845BAA19F10AC3FA2AAD59D1926885E3F7E3BAF
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1757030345
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: yes

もし、使用できない暗号化スイートを指定すると、

SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1757030235
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: no

のように表示されます。

疑問点

TLS1.2の場合は、指定した暗号化スイートが使用できなければ、ちゃんと弾かれますが、TLS1.3の場合は、なぜかアクセスできてしまいます。しかし、よく確認すると、指定した暗号化スイートでアクセスはしておらず、 apacheで許可されている別の暗号化スイートでのアクセスとなっております。

具体的には、ssl.conf に記載していたSSLCipherSuiteを

SSLCipherSuite TLSv1.3 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256

として、こちらで、

のコマンドを実行した結果、

SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_AES_256_GCM_SHA384
    Session-ID: C1A6CB5C97DB4B21BA010644E9D9591340814E5E2
    Session-ID-ctx:
    Resumption PSK: AA8A2680ED2AC59E0B002A8DCD80F38493B10597DF108F933DE0FE604C26
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:

となり、Cipher    : TLS_AES_256_GCM_SHA384 を使用しています。(こちらは問題ありません)

次に、ssl.confの内容を、

SSLCipherSuite TLSv1.3 TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_CCM_SHA256:TLS_AES_128_CCM_8_SHA256

に修正して、「AES256-GCM-SHA384」を外した状態で同じコマンド

を実行して、動作確認すると

SSL-Session:
    Protocol  : TLSv1.3
    Cipher    : TLS_CHACHA20_POLY1305_SHA256
    Session-ID: 0A72668A39E47B15C30E78E21893AE032D718D2E
    Session-ID-ctx:
    Resumption PSK: 04C6B102723EAFE122CDE39BD115E824C26A415
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:

となり、指定したCipherが、AES256-GCM-SHA384ではなく、TLS_CHACHA20_POLY1305_SHA256 を使用して通信が成功しました。

その暗号化スイートは使用できないと出てくれたら良かったのですが、なぜか自動で別の暗号化スイートを使用しています。こちらTLS1.3の場合のみで発生しています。何故なんでしょうね。

最後までお読み頂き、ありがとうございました。今回はここまです。