Microsoft.Data.SqlClient での暗号化と証明書の検証
SQL Server は、常に、ログインに関連するネットワーク パケットを暗号化します。 サーバーの起動時にそれに証明書がプロビジョニングされていない場合は、ログイン パケットの暗号化に使用される自己署名入りの証明書が SQL Server によって生成されます。
大まかに言えば、クライアントとサーバーの間の暗号化により、データは確実にクライアントとサーバーのみが読み取り可能となります。 暗号化プロセスの重要な部分は、サーバー証明書の検証です。 サーバー証明書の検証では、クライアントはサーバーが本物であることを確かめることができます。 証明書は、有効期限、信頼チェーンなどについて検証され、証明書内の名前がクライアントが接続しているサーバーの名前と一致することが確認されます。 詳細については、「トランスポート層セキュリティとデジタル証明書」を参照してください。
セキュリティで保護された接続を実現するには、SQL Server 上に検証可能な証明書をプロビジョニングすることを強くお勧めします。 トランスポート層セキュリティ (TLS) は、証明書の検証によってのみセキュリティで保護することができます。
アプリケーションでは、Encrypt
接続文字列キーワードまたは接続プロパティを使用して、すべてのネットワーク トラフィックの暗号化を要求できます。 既定では、接続のネットワーク トラフィックをすべて暗号化するには、証明書をサーバーにプロビジョニングする必要があります。 クライアントがサーバー上の証明書を信頼するように設定すると、中間者攻撃に対して脆弱になる可能性があります。 検証可能な証明書をサーバーに展開する場合は、クライアントの Encrypt
設定が True
で、Trust Server Certificate
設定が False
であることを確かめます。
証明書がサーバーでプロビジョニングされていないときに暗号化の使用を有効にするには、Encrypt
と Trust Server Certificate
のクライアント設定を使用できます。 この場合、暗号化では、クライアントによる検証を伴わない自己署名入りのサーバー証明書が使用されます。 この構成では接続を暗号化しますが、クライアントとサーバーの間のデバイスが接続を傍受して暗号化をプロキシすることを防ぐわけではありません。
暗号化と証明書の検証動作の変更
Microsoft.Data.SqlClient のバージョン 4.0 では、暗号化設定に破壊的変更が導入されています。 Encrypt
は既定で True
に設定されるようになりました。
Microsoft.Data.SqlClient のバージョン 2.0 では、Trust Server Certificate
設定の動作に破壊的変更が導入されています。 以前は、Encrypt
が False
に設定されている場合、Trust Server Certificate
設定に関係なく、サーバー証明書は検証されませんでした。 現在、Encrypt
が False
に設定されている場合でも、サーバーによって暗号化が強制された場合は、Trust Server Certificate
設定に基づいてサーバー証明書が検証されます。
Version 4.0
次の表では、暗号化と証明書の設定に関する暗号化と検証の結果について説明します。
Encrypt クライアント設定 |
Trust Server Certificate クライアント設定 |
Force encryption サーバー設定 |
結果 |
---|---|---|---|
False | False (既定値) | いいえ | 暗号化は、LOGIN パケットに対してのみ行われます。 証明書は検証されません。 |
False | False (既定値) | はい | (バージョン 1.0 から 2.0 の動作変更) すべてのネットワーク トラフィックの暗号化は、検証可能なサーバー証明書が存在する場合にのみ行われます。それ以外の場合、接続試行は失敗します。 |
False | True | はい | すべてのネットワーク トラフィックの暗号化が行われ、証明書は検証されません。 |
True (新しい既定値) | False (既定値) | 該当なし | すべてのネットワーク トラフィックの暗号化は、検証可能なサーバー証明書が存在する場合のみ行われます。それ以外の場合、接続試行は失敗します。 |
True (新しい既定値) | True | 該当なし | すべてのネットワーク トラフィックの暗号化が行われますが、証明書は検証されません。 |
Strict (バージョン 5.0 で追加) | 該当なし | 該当なし | すべてのネットワーク トラフィックの暗号化は、検証可能なサーバー証明書が存在する場合にのみ、TDS 8 を使用して行われます。それ以外の場合、接続試行は失敗します。 |
注意事項
上の表では、さまざまな構成でのシステムの動作についてのみ説明しています。 セキュリティで保護された接続を実現するには、クライアントとサーバーの両方で暗号化が必要であることを確実にします。 また、確実にサーバーで検証可能な証明書を用意し、クライアント上の TrustServerCertificate
設定を False
に設定します。
Microsoft.Data.SqlClient バージョン 5.0 以降、HostNameInCertificate
は新しい接続オプションです。 サーバー証明書検証では、証明書内の共通名 (CN) またはサブジェクト代替名 (SAN) が接続先のサーバー名と一致することを確かめます。 DNS エイリアスなどの場合、サーバー名が CN や SAN と一致しないこともあります。 HostNameInCertificate
値を使うと、サーバー証明書内で別の予期される CN または SAN を指定できます。
バージョン 2.0
バージョン 2.0 以降、サーバーによって暗号化が強制されると、クライアントでは、Encrypt
設定に関係なく、Trust Server Certificate
設定に基づいてサーバー証明書を検証します。
次の表では、暗号化と証明書の設定に関する暗号化と検証の結果について説明します。
Encrypt クライアント設定 |
Trust Server Certificate クライアント設定 |
Force encryption サーバー設定 |
結果 |
---|---|---|---|
False (既定値) | False (既定値) | いいえ | 暗号化は、LOGIN パケットに対してのみ行われます。 証明書は検証されません。 |
False (既定値) | False (既定値) | はい | (動作変更) すべてのネットワーク トラフィックの暗号化は、検証可能なサーバー証明書が存在する場合にのみ行われます。それ以外の場合、接続試行は失敗します。 |
False (既定値) | True | はい | すべてのネットワーク トラフィックの暗号化が行われ、証明書は検証されません。 |
True | False (既定値) | 該当なし | すべてのネットワーク トラフィックの暗号化は、検証可能なサーバー証明書が存在する場合のみ行われます。それ以外の場合、接続試行は失敗します。 |
True | True | 該当なし | すべてのネットワーク トラフィックの暗号化が行われますが、証明書は検証されません。 |
注意事項
上の表では、さまざまな構成でのシステムの動作についてのみ説明しています。 セキュリティで保護された接続を実現するには、クライアントとサーバーの両方で暗号化が必要であることを確実にします。 また、確実にサーバーで検証可能な証明書を用意し、クライアント上の TrustServerCertificate
設定を False
に設定します。
バージョン 1.0
次の表では、暗号化と証明書の設定に関する暗号化と検証の結果について説明します。
Encrypt クライアント設定 |
Trust Server Certificate クライアント設定 |
Force encryption サーバー設定 |
結果 |
---|---|---|---|
False (既定値) | False (既定値) | いいえ | 暗号化は、LOGIN パケットに対してのみ行われます。 証明書は検証されません。 |
False (既定値) | False (既定値) | はい | すべてのネットワーク トラフィックの暗号化が行われますが、証明書は検証されません。 |
False (既定値) | True | はい | すべてのネットワーク トラフィックの暗号化が行われ、証明書は検証されません。 |
True | False (既定値) | 該当なし | すべてのネットワーク トラフィックの暗号化は、検証可能なサーバー証明書が存在する場合のみ行われます。それ以外の場合、接続試行は失敗します。 |
True | True | 該当なし | すべてのネットワーク トラフィックの暗号化が行われますが、証明書は検証されません。 |