ここでは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 --script ssl-enum-ciphers -p 443 dassyi.com
もしnmapのコマンドがインストールされていなければ、以下のコマンドでインストールします。
# dnf install 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
openssl> ciphers -v
opensslコマンドで、実際に暗号化スイートを指定してウェブサーバへアクセスするには以下のコマンドを実行します。
> s_client -connect サイトのFQDN:443 -cipher 使用する暗号化スイート -tlsのバージョン
# openssl
openssl> s_client -connect dassyi.com:443 -cipher AES128-GCM-SHA256 -tls1_2
openssl> s_client -connect dassyi.com:443 -cipher AES128-GCM-SHA256 -tls1_3
上記コマンドを実行すると、暗号化スイートが使える場合は、ズラズラと大量に文字列が表示され、「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
として、こちらで、
# openssl
openssl> s_client -connect test.dassyi.com:443 -cipher AES256-GCM-SHA384 -tls1_3
のコマンドを実行した結果、
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」を外した状態で同じコマンド
# openssl
openssl> s_client -connect test.dassyi.com:443 -cipher AES256-GCM-SHA384 -tls1_3
を実行して、動作確認すると
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の場合のみで発生しています。何故なんでしょうね。
最後までお読み頂き、ありがとうございました。今回はここまです。