TLSプロトコルと証明書検証の設定

TLSプロトコルの選択と証明書検証を確認してください。

説明

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に対応していることを確認してください。

    python
    client_context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
    client_context.minimum_version = ssl.TLSVersion.TLSv1_3
    client_context.maximum_version = ssl.TLSVersion.TLSv1_3
    

参考資料