説明
SSLやTLS 1.0・1.1などの古いプロトコルは使用しないでください。TLS 1.2またはTLS 1.3の安全な構成を使い、可能であればTLS 1.3を優先してください。プロトコルの選択に加え、証明書チェーンとホスト名の検証も必要です。
想定される影響
- 情報漏えい: 弱いプロトコル設定によって、暗号化された情報が侵害されるおそれがあります。
- 中間者攻撃: 通信を傍受・改ざんされる可能性があります。
対処方法
- 最小バージョンをTLS 1.2以上にし、要件と互換性が許す場合はTLS 1.3を使ってください。
- クライアントでは、信頼するCAの証明書チェーンとホスト名を検証してください。サーバーには、サーバー用コンテキストと適切な証明書・秘密鍵を設定してください。
例
変更前
python
# 接続相手の検証を構成していない汎用コンテキスト
import ssl
import socket
context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
with socket.create_connection(('example.com', 443)) as sock:
with context.wrap_socket(sock, server_hostname='example.com') as ssock:
print(ssock.version())
変更後
python
# 証明書とホスト名を検証するTLSクライアント
import ssl
import socket
context = ssl.create_default_context()
context.minimum_version = ssl.TLSVersion.TLSv1_2
with socket.create_connection(('example.com', 443)) as sock:
with context.wrap_socket(sock, server_hostname='example.com') as ssock:
print(ssock.version())
説明
-
変更前:
PROTOCOL_SSLv23は、汎用TLSコンテキストの古い別名です。名前だけでSSLを使うとは判断できませんが、このコードは証明書とホスト名の検証を構成していません。使用可能なバージョンはPython、OpenSSL、設定によって変わります。 -
変更後:
create_default_context()でサーバー証明書とホスト名の検証を有効にし、最小TLSバージョンを1.2に明示します。 -
以下のようにTLS 1.3だけを許可することもできます。コンテキスト設定の抜粋なので、接続前に信頼するCAを読み込み、双方がTLS 1.3に対応していることを確認してください。
pythonclient_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) client_context.minimum_version = ssl.TLSVersion.TLSv1_3 client_context.maximum_version = ssl.TLSVersion.TLSv1_3