Microsoft.Data.SqlClient での暗号化と証明書の検証

ADO.NET のダウンロード

トランスポートレイヤーセキュリティ(TLS)を使って、アプリケーションとSQL Server間のトラフィックを暗号化しましょう。 サーバー証明書検証を有効にしてサーバーの本人確認を行ってください。 アイデンティティ検証なしの暗号化では、サーバーを偽装する 中間 攻撃者からは守れません。

Microsoft。Data.SqlClientはデフォルトでEncrypt=MandatoryとTrustServerCertificate=falseです。 Encrypt=true は Mandatory のシノニムです。 リモート接続の場合、これらの設定を明示的に要求し、クライアントが検証可能なサーバー証明書をプロビジョニングします。

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;MultiSubnetFailover=true;

プレースホルダーを置き換え、サーバーやアプリケーション環境でサポートされている 認証方法 を使いましょう。 Microsoft FabricのAzure SQLまたはSQLデータベースについては、Microsoft Entra認証を参照してください。

暗号化モードを選択します

Encrypt クライアントが暗号化を必要とするかどうかを制御します。 サーバーは暗号化を必要とする場合もあります。 この表は証明書ピンニングなしの現在の動作を示しています:

クライアント設定 サーバーの要件 証明書の検証 結果
Encrypt=Optional または false 暗号化を強制するわけではありません。 TrustServerCertificate に関係なく、ありません。 暗号化されているのはログインパケットのみです。 その後のトラフィックは暗号化されていません。
Encrypt=Optional;TrustServerCertificate=false 暗号化を強制します。 信頼チェーン、有効性、サーバー名。 すべての通信は暗号化されています。 無効な証明書は接続に失敗します。
Encrypt=Optional;TrustServerCertificate=true 暗号化を強制します。 バイパスされました。 すべてのトラフィックは暗号化されていますが、サーバーの身元は検証されません。
Encrypt=Mandatory;TrustServerCertificate=false どちらの設定でも。 信頼チェーン、有効性、サーバー名。 すべての通信は暗号化されています。 無効な証明書は接続に失敗します。
Encrypt=Mandatory;TrustServerCertificate=true どちらの設定でも。 バイパスされた。 すべてのトラフィックは暗号化されていますが、サーバーの身元は検証されません。
Encrypt=Strict タブラーデータストリーム(TDS)8.0をサポートしています。 必須。 TrustServerCertificate 回避できません。 TLSはTDSメッセージの前に始まります。 サポートされていないサーバーや無効な証明書は接続に失敗します。

TDS 8.0をサポートしていないサーバーへの暗号化接続には Mandatory を使いましょう。 Strictは、SQL Server 2022(16.x)以降のバージョンを含むTDS 8.0をサポートしている場合に利用してください。 TDS 8.0はTLS 1.2とTLS 1.3をサポートしています。TLS 1.3は必須ではありません。 交渉されたTLSバージョンは、クライアント、サーバー、オペレーティングシステムの構成にも依存します。

Optional 証明書の誤りに対する救済にはなりません。 サーバーが暗号化を必要としない場合、アプリケーションデータを暗号化せずに残すこともあります。

検証可能なサーバー証明書の設定

通常の証明書検証については:

  1. SQL Server証明書の要件を満たす証明書をプロビジョニングしてください。
  2. 証明書の主題の代替名(SAN)に、クライアントが接続するために使用する名前を含めてください。
  3. 発行する証明書発行機関および必要な中間証明書を、すべてのクライアントホストやコンテナで信頼させましょう。
  4. 証明書を使うようにSQL Server設定し、クライアント内でTrustServerCertificate=falseを保持してください。
  5. プラン証明書の更新は期限切れ前に行われ、名称や発行機関の変更も含まれます。

公的または企業の証明書発行機関からの証明書はこれらの要件を満たすことができます。 エンタープライズ証明書はLinuxコンテナ内や別の開発者コンピュータ上で自動的に信頼されるわけではありません。

別名で繋がる

もし接続が証明書に記載されていないドメインネームシステム(DNS)エイリアスを使用している場合は、まずそのエイリアスを含む証明書の発行を検討してください。 または、 HostNameInCertificate を証明書内の期待される名前に設定してください:

Server=tcp:sql-alias.contoso.com,1433;Database=<database>;Integrated Security=true;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=sql-server.contoso.com;MultiSubnetFailover=true;

HostNameInCertificate 証明書検証時にSqlClientが期待する名前を変更します。 ネットワークの宛先を変更したり、トラストチェーンや有効期限のチェックを回避したりはしません。 サーバー名がすでに証明書と一致している場合は、設定を解除したままにしてください。

特定のサーバー証明書をピン留めしてください

ServerCertificate サーバーの証明書と正確に比較するためのローカル証明書ファイルを提供します。 サポートされる形式は、.cer 証明書ファイルを含む Privacy-Enhanced Mail (PEM) および Distinguished Encoding Rules (DER) です。 Encrypt=MandatoryまたはEncrypt=Strictと一緒に使用し、TrustServerCertificate=falseを維持します。

Server=tcp:<server>,1433;Database=<database>;Integrated Security=true;Encrypt=Strict;TrustServerCertificate=false;ServerCertificate=C:\certificates\sql-server.cer;MultiSubnetFailover=true;

期待される証明書を信頼できるチャネルを通じて配布し、ファイルを置換から守ります。 完全な証明書照合は、通常のチェーンと名前の検証の代替手段であり、追加のチェックではありません。 証明書のバイトは一致しなければなりません。同じ主題名や公開鍵だけでは不十分です。 ピンファイルが欠損、読み取れない、無効または不一致の場合は検証に失敗します。

ピン接続はクライアントの展開を証明書ローテーションに結びつけます。 サーバー証明書が変更された際、更新も含めてPINを更新してください。 ネットワークから認証されていない証明書を受け取ってPINを取得しないでください。

SqlClientは任意のTLSサーバー証明書検証のための公開コールバックを公開しません。 AccessTokenCallback 認証トークン取得を制御し、TLSの検証ではありません。

開発証明書とトラブルシューティング

正しいサーバー名の信頼できる開発証明書を使用してください。 もし一時的に TrustServerCertificate=true を隔離された開発環境で Encrypt=true と併用した場合、接続は暗号化されていますが、クライアントはサーバー証明書を認証しません。

注意事項

証明書エラーの本番修正として TrustServerCertificate=true を展開しないでください。 Mandatoryではサーバーのアイデンティティ検証を無効にし、Strictには影響しません。

Failure 確認
証明書チェーンは信頼されていません。 クライアントに適切な信頼されたルートと中間ファイルをインストールしてください。 SQL Serverが実際に提示する証明書を確認してください。
証明書名が一致しません。 証明書SANと Server を比較してください。 名前、証明書、意図的な HostNameInCertificate オーバーライドを修正してください。
証明書は期限切れです。 サーバー証明書を更新し、クライアントのクロックを確認してください。
ピン留めされた証明書が一致しないか、読み込めない。 ファイルパス、権限、フォーマット、デプロイ済み証明書を確認してください。 信頼できる配布プロセスを通じてPINを更新してください。
厳密な暗号化では接続できません。 エンドポイントがTDS 8.0に対応していること、そしてそのTLS構成がクライアントと互換性があるかを確認してください。

サーバー側の設定については、 証明書の概要を参照してください。

暗号化と証明書の検証動作の変更

これらの互換性ノートは、古いアプリケーションのアップグレード時の挙動変更について説明しています。 新しいアプリケーションはこの記事で説明されている現在の設定を使うべきです。

ドライバーのリリース 変更
1.0 Encrypt=false はデフォルト値です。 クライアントが暗号化を要求しない場合、サーバーによる強制暗号化は証明書検証をトリガーしません。
2.0 サーバー強制の暗号化は、TrustServerCertificate場合でもEncrypt=falseを尊重します。
4.0 暗号化はデフォルトで有効になります。 アップグレードは、これまで気づかれなかった証明書設定エラーを露呈させることがあります。
5.0 Optional、Mandatory、Strict、HostNameInCertificateを追加します。
5.1 証明書ピンニング用に ServerCertificate を追加します。
7.0.3 管理対象ネットワークの証明書ピン検証について、通常のプラットフォーム検証が成功した場合でも、ファイルが存在しない、無効である、または一致しないときにはフェイルクローズするよう修正します。