mssql-pythonによる暗号化とTLS

mssql-pythonドライバーはトランスポート層セキュリティ(TLS)を通じて暗号化された接続をサポートします。 暗号化はアプリケーションとSQL Server間のデータを保護し、盗聴や敵対者による中間攻撃を防ぎます。

接続暗号化

暗号化を有効にする

Encryptキーワードを使って接続暗号化を制御します:

import mssql_python

# Require encryption (recommended)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
)

暗号化キーワード値

価値 説明
yes 暗号化が必要で、サーバーがTLSをサポートしていない場合は失敗します。
no 接続は暗号化されません。 運用環境での使用は推奨されません。
strict TDS 8.0の厳密暗号化モードを使用しています。 SQL Server 2022以降が必要です。

Important

Azure SQL Database にはEncrypt=yesが必要です。 暗号化されていない接続は拒否されます。

証明書の検証

TrustServerCertificate

ドライバーがサーバーのTLS証明書を検証するかどうかを制御します:

# Validate server certificate (recommended for production)
conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

# Skip certificate validation (development only)
conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)
価値 説明
no 信頼できるCAに対して証明書を検証します。 この値はデフォルトかつ推奨される設定です。
yes 証明書を信頼し、検証を省略します。 この環境は不安定です。

Caution

本番環境で TrustServerCertificate=yes を設定すると、アプリケーションが中間者攻撃にさらされることになります。 この設定は自己署名証明書の開発時のみ使用してください。

TDS 8.0 厳密暗号化

SQL Server 2022以降は厳密暗号化モードのTDS 8.0をサポートしています:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Encrypt=strict;"
)

厳格モードは最高レベルのセキュリティを提供します:

  • 運転手はTDSの握手前にTLSを確立します。
  • 証明書の検証は必須で、 TrustServerCertificate=yesは使えません。
  • このモードは傍受に対する最高レベルの保護を提供します。

HostNameInCertificate

サーバーの証明書名と接続サーバー名が一致しない場合:

conn = mssql_python.connect(
    "Server=192.168.1.100;"  # IP address
    "Database=<database>;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
    "HostNameInCertificate=<server>.contoso.com;"  # Certificate CN
)

このキーワードは以下の場合に有用です:

  • アプリケーションはホスト名ではなくIPアドレスで接続します。
  • サーバーはロードバランサーの背後にあります。
  • 証明書は接続サーバー名とは異なる主題名を使用します。

Azure SQL Database

Azure SQL Database は暗号化が必要です:

conn = mssql_python.connect(
    "Server=<server>.database.windows.net;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

オンプレミス SQL Server(本番)

CA署名証明書を持つオンプレミスSQL Serverでは、ドライバがサーバーIDを検証するためにTrustServerCertificate=noを保持してください:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=no;"
)

自己署名証明書による開発

自己署名証明書の開発中は、 TrustServerCertificate=yes を証明書検証をスキップするように設定してください:

conn = mssql_python.connect(
    "Server=localhost;"
    "Database=<database>;"
    "Authentication=ActiveDirectoryDefault;"
    "Encrypt=yes;"
    "TrustServerCertificate=yes;"
)

厳格モード対応のSQL Server 2022以降バージョン

TDS 8.0には Encrypt=strict を使いましょう。これは接続全体を最初からTLSでラップします:

conn = mssql_python.connect(
    "Server=<server>;"
    "Database=<database>;"
    "Encrypt=strict;"
)

Troubleshooting

「SSLプロバイダー:証明書検証失敗」

サーバー証明書は検証できませんでした。 以下のチェックを実行してください:

  • 証明書が信頼できるCAからのものか確認してください。
  • 証明書の有効期限が有効かどうかを確認してください。
  • サーバーのホスト名が証明書のCNまたはSANと一致しているか確認してください。
  • 開発には、 TrustServerCertificate=yesを使用します。

「TCPプロバイダー:既存の接続が強制的に閉鎖された」

サーバーは暗号化を必要としているかもしれませんが、クライアントはそれを要求していません。 次の手順を試してください。

  • Encrypt=yes を接続文字列に追加してください。
  • SQL Serverの設定で強制暗号化の設定を確認してください。

「証明書チェーンは信頼されていない権威によって発行された」

証明書のルートCAはシステムの信頼されたルートストアには存在しません。 以下のチェックを実行してください:

  • CA証明書を信頼されたルートストアにインストールしてください。
  • Azure SQLについては、システムがMicrosoftのCA証明書を信頼していることを確認してください。
  • 開発には、 TrustServerCertificate=yesを使用します。

厳密暗号化で接続が失敗します

TDS 8.0の厳格モードには以下の要件があります:

  • サーバーはSQL Server 2022以降のバージョンでなければなりません。
  • サーバーは有効で信頼できる証明書を持っている必要があります。
  • TrustServerCertificate=yes設定できません。

サーバーがTDS 8.0をサポートしていない場合は、代わりに Encrypt=yes を使いましょう。