Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

Apache httpd(mod_ssl環境)において、SSLProtocolとSSLCipherSuiteの設定方法

はじめに

SSLProtocolとSSLCipherSuiteを指定することで、Apacheサーバーが受け付けるTLSプロトコルバージョンと暗号化の方法を制限できます。
本記事では、Apache httpd(mod_ssl環境)のTLS暗号化の設定方法を紹介します。

注意事項

本記事では、ソースコードからのインストールなど、一般的によくあるユースケースを前提に解説します。
Apache側でTLSバージョンや暗号スイートの許容設定を行っても、OS設定によって拒否になる場合があります。設定する前に一度OS設定を確認しましょう。

RHEL9設定関連

また、各レポジトリーのApacheパッケージに改造が入ってる可能性があり、Apacheのデフォルト設定や設定方法が異なる可能性があります。

SSLProtocolの設定方法

SSLProtocol記述の後ろに、+プロトコル名を付けることで指定したプロトコルを許容でき、 -プロトコル名でプロトコルの通信を拒否できます。
プロトコルを複数指定する場合スペースで区切ります。

指定できるプロトコル名

SSLv3、TLSv1、TLSv1.1、TLSv1.2、TLSv1.3  

上記以外、allという特殊記述があり、OpenSSL 1.0.1以降 +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2の略になります。
ゼロベースから設定したい場合、設定の先頭に-allを付けておきましょう。

TLSv1.2とv1.3を許容する記述例

<VirtualHost *:443>
    ...
    SSLProtocol -all +TLSv1.2 +TLSv1.3
</VirtualHost>

SSLProtocolのデフォルト設定

SSLProtocolのデフォルト設定はApacheとOpenSSLのバージョンによります。

Apache <= 2.4.16かつOpenSSL < 1.0.1 : +SSLv3 +TLSv1
Apache <= 2.4.16かつOpenSSL >= 1.0.1 : +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2
Apache > 2.4.16かつOpenSSL >= 1.0.1 : +TLSv1 +TLSv1.1 +TLSv1.2

SSLCipherSuiteの設定方法

SSLCipherSuite記述の後ろに、許可したい暗号スイートを:で区切って指定できます。
暗号スイートを複数指定する場合、先に指定された暗号スイートが優先されます。

TLS_AES_128_GCM_SHA256、TLS_AES_256_GCM_SHA384とECDHE-ECDSA-AES128-GCM-SHA256を利用可能にする記述例

<VirtualHost *:443>
    ...
    SSLCipherSuite TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-AES128-GCM-SHA256
</VirtualHost>

個別の暗号スイートだけでなく、特徴ベースのタグで暗号スイートを一括指定できます。
暗号スイートの前に記号をつけることで優先順位を変更できます。

+:暗号スイートをこの位置に移動する
-:暗号スイートを許可しない(再許可可能)
!:暗号スイートを許可しない(再許可不可)

MD5を使う暗号スイート以外すべて許可、低い安全性の暗号スイートの優先度を一番低くする例

SSLCipherSuite ALL:!MD5:+LOW

SSLCipherSuiteのデフォルト設定

SSLCipherSuiteのデフォルト設定はOpenSSLのデフォルト暗号スイートセットを使用しています。
セットの内容はOpenSSLバージョン依存で、以下のように確認できます。

# openssl ciphers -v 'DEFAULT'
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
TLS_AES_128_CCM_SHA256         TLSv1.3 Kx=any      Au=any   Enc=AESCCM(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
...

Apacheパッケージ提供元の改修によって、SSLCipherSuiteのデフォルト値が別で設定される場合があるため、設定に気を付けましょう。

設定が効いてるかの確認方法

nmapを使って、サーバーが受け付けるTLSバージョンと暗号スイートを確認できます。
https://nmap.org/nsedoc/scripts/ssl-enum-ciphers.html

[root@ip-10-0-101-157 bin]# nmap --script ssl-enum-ciphers {IPアドレス}
Starting Nmap 7.93 ( https://nmap.org ) at 2025-05-02 09:43 UTC
Nmap scan report for ●●●.net (●●●)
Host is up (0.0013s latency).
Not shown: 998 filtered tcp ports (no-response)
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https
| ssl-enum-ciphers:
|   TLSv1.0:
|     ciphers:
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|     compressors:
|       NULL
|     cipher preference: server
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|   TLSv1.1:
|     ciphers:
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|     compressors:
|       NULL
|     cipher preference: server
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|   TLSv1.2:
|     ciphers:
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (ecdh_x25519) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (ecdh_x25519) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|     compressors:
|       NULL
|     cipher preference: server
|     warnings:
|       64-bit block cipher 3DES vulnerable to SWEET32 attack
|   TLSv1.3:
|     ciphers:
|       TLS_AKE_WITH_AES_128_GCM_SHA256 (ecdh_x25519) - A
|       TLS_AKE_WITH_AES_256_GCM_SHA384 (ecdh_x25519) - A
|       TLS_AKE_WITH_CHACHA20_POLY1305_SHA256 (ecdh_x25519) - A
|     cipher preference: client
|_  least strength: C

Nmap done: 1 IP address (1 host up) scanned in 6.47 seconds

参考資料

推奨される暗号スイート

設定方法の情報参考元