元の製品バージョン: SQL Server
元の KB 番号: 2007728
まとめ
この記事は、クライアントが暗号化された (TLS) 接続をSQL Serverしたときに発生する "リモート サーバーから受信した証明書が信頼されていない証明機関によって発行されました" というエラーを解決するのに役立ちます。 このエラーは、通常、発行元の証明機関 (CA) がクライアントの信頼されたルート証明機関ストアに存在しないか、または SQL Server が自己署名証明書を使用しているために、クライアントが TLS ハンドシェイク中に SQL Server インスタンスによって提示される証明書を検証できないことを意味します。
エラーを解決するには、発行元の CA 証明書をクライアント コンピューターにインストールするか、検証なしでサーバー証明書を信頼するか ( 信頼サーバー証明書 の設定)、またはクライアントまたはサーバーの暗号化構成を変更します。 いくつかのクライアント ドライバーとツールの最近のバージョンでは、暗号化が必要になるように既定値が変更されているため、サーバーで何も変更されていない場合でも、ドライバーまたはツールのアップグレード後にこのエラーが表示されることがあります。
症状
SQL Serverに接続すると、次のエラー メッセージが表示されることがあります。
サーバーとの接続は正常に確立されましたが、ログイン プロセスでエラーが発生しました。 (プロバイダー: SSL プロバイダー、エラー: 0 - 信頼されていない機関によって証明書チェーンが発行されました。(.Net SqlClient Data Provider)
さらに、次のエラー メッセージが Windows システム イベント ログに記録されます。
Log Name: System
Source: Schannel
Date: 10/13/2020 3:03:31 PM
Event ID: 36882
Task Category: None
Level: Error
Keywords:
User: USERNAME
Computer: COMPUTERNAME
Description:
The certificate received from the remote server was issued by an untrusted certificate authority. Because of this, none of the data contained in the certificate can be validated. The TLS connection request has failed. The attached data contains the server certificate.
原因
このエラーは、クライアントが検証できない証明書を使用して、SQL Serverへの暗号化された接続を確立するときに発生します。 この動作は、次のシナリオで発生します。
| シナリオ | サーバー側暗号化 | クライアント側暗号化 | 証明書タイプ | 信頼されたルート証明機関ストアに存在する証明書発行機関 |
|---|---|---|---|---|
| 1 | はい | いいえ | クライアントが信頼していないソースからの証明書 (発行元の証明機関がクライアント コンピューターの信頼されたルート証明機関に一覧表示されていない) | いいえ |
| 2 | いいえ | はい | SQL Server生成される自己署名証明書 | No. 自己署名証明書は、このストアには表示されません。 |
クライアントがSQL Serverへの暗号化された接続を確立すると、Secure Channel (Schannel) は、ローカル コンピューター上の信頼されたルート証明機関ストアを検索して、信頼された証明機関の一覧を作成します。 サーバーでは、TLS ハンドシェイクの際にクライアントに公開キー証明書が送信されます。 公開キー証明書の発行者は、証明機関 (CA) と呼ばれます。 クライアントは、CA を信頼していることを確認する必要があります。これは、信頼された CA の公開キーを事前に把握することによって行われます。 前の 2 つのシナリオなど、信頼されていない証明機関が発行した証明書が Schannel によって検出されると、「 現象 」セクションに一覧表示されているエラー メッセージが表示されます。
適切な証明書が構成または検出されない場合、データベース エンジンは起動時に自己署名フォールバック証明書を生成します。 この証明書を使用してログイン資格情報を暗号化し、サーバー側またはクライアント側の暗号化が有効になっている場合は、接続全体を暗号化します。 既定では、自己署名証明書を信頼するクライアントがないため、クライアントとサーバーが同じコンピューター上で実行されている場合でも、SQL Serverの既定のインストールでこのエラーが発生する可能性があります。 詳細については、「 ログイン パケット暗号化とデータ パケット暗号化」を参照してください。
ドライバーまたはツールのアップグレード後にこのエラーが表示される理由
次の表のクライアント ドライバーとツールのバージョンは、暗号化を必要とするように既定値を変更しました。 これらのバージョンのいずれかにアップグレードした後、クライアントは接続を暗号化し、サーバー構成が変更されなかった場合でもサーバー証明書を検証します。 以前のバージョンでは既定で暗号化が必要なかったため、明示的に暗号化を要求しない限り、証明書は検証されませんでした。
| クライアント ドライバーまたはツール | バージョン | 既定の暗号化動作 |
|---|---|---|
Microsoft OLE DB Driver for SQL Server (MSOLEDBSQL19) |
19 以降のバージョン |
Encrypt の既定値は Mandatory です |
| Microsoft ODBC Driver for SQL Server (Microsoft SQL Server 用 ODBC ドライバー) | 18 以降のバージョン |
Encrypt の既定値は Mandatory です |
Microsoft.Data.SqlClient |
4.0 以降のバージョン |
Encrypt の既定値は True です |
| SQL Server Management Studio (SSMS) | 20 以降のバージョン | 暗号化 の既定値は [必須] |
SQL Server Native Client 11.0 (SNAC) から OLE DB Driver 19 または Microsoft Microsoft ODBC Driver 18 にアプリケーションを移行した直後にこのエラーが表示される場合は、「ドライバーのアップグレード後に証明書チェーンが信頼されない」を参照してください。
SNAC は、SQL Server 2022 (16.x) 以降のバージョンまたは SSMS 19 以降のバージョンには付属していません。また、新しい開発にはお勧めしません。 代わりに、Microsoft OLE DB Driver for SQL Server、Microsoft ODBC Driver for SQL Server、またはMicrosoft.Data.SqlClientを使用します。 詳細については、「SQL Server Native Client のサポート ポリシー」を参照してください。
ソリューション
非信頼機関の証明書または自己署名証明書を意図的に使用してSQL Serverへの接続を暗号化する場合は、次のいずれかのオプションを使用します。
- 証明書の検証を維持し、信頼の問題を完全に解決するには、 オプション 1: クライアント コンピューターに証明機関をインストールします。
- 証明書をインストールせずにすぐに接続するには、 オプション 2: サーバー証明書を検証せずに信頼するを使用します。 このオプションは最も簡単な修正であり、SQL Serverが既定の自己署名証明書を使用する場合にほとんどのユーザーが必要とするオプションです。
- 暗号化の要求を停止したり、証明書を信頼された機関の証明書に置き換えたりするには、 オプション 3: 暗号化構成を変更します。
オプション 1: クライアント コンピューターに証明機関をインストールする
シナリオ 1 では、暗号化された接続を開始するクライアント コンピューターの信頼されたルート証明機関ストアに証明機関を追加します。 これを行うには、「 手順 1: サーバー証明書をファイルにエクスポートする 」を完了し、 手順 2: その順序でクライアント コンピューターの手順にルート証明機関 (CA) をインストール します。
手順 1: サーバー証明書をファイルにエクスポートする
SQL Server コンピューターで、SQL Server使用する証明書をファイルにエクスポートします。 次の手順では 、 ファイル名の例としてcaCert.cerを使用します。 このファイルは、この手順で作成するまで存在しません。 名前と場所を選択します。
[スタート] を選択し、「mmc」と入力して、Microsoft 管理コンソールを開きます。
[ファイル]>[スナップインの追加と削除] を選択します。
[利用できるスナップイン] ボックスのリストで [証明書] を選択し、 [追加] を選択します。
[ コンピューター アカウント] を選択し、[ 次へ] を選択し、[ ローカル コンピューター: (このコンソールが実行されているコンピューター)]、[完了] の順に選択 します。
注
SQL Server証明書は、ローカル コンピューター\個人用証明書ストアにインストールされます。 [マイ ユーザー アカウント] を選択した場合、MMC は別の証明書ストアを開き、SQL Server証明書は表示されません。
[ OK] を 選択して、[ スナップインの追加と削除 ] ダイアログ ボックスを閉じます。
左側のウィンドウで、[ 証明書 (ローカル コンピューター)]、[ 個人] の順に展開し、[ 証明書] を選択します。
SQL Server使用する証明書を右クリックし、すべてのタスク>Export を選択します。
[次へ] を選択して、証明書のエクスポート ウィザードの [ようこそ] ページを越えて移動します。
いいえ、秘密キーをエクスポートしない が選択されていることを確認し、次へ を選択します。
DER でエンコードされたバイナリ X.509 (.CER) または Base-64 でエンコードされた X.509 (.CER) が選択され、[次へ] を選択します。
caCert.cer などのエクスポート ファイル名を入力します。
[ 次へ] を選択し、[ 完了] を選択して証明書をエクスポートします。
エクスポートした .cer ファイルをクライアント コンピューターにコピーします。
手順 2: クライアント コンピューターにルート証明機関 (CA) をインストールする
クライアント コンピューターで MMC を開き、[ファイル]>[スナップインの追加と削除]、[使用可能なスナップイン] ボックスの一覧の [証明書] の順に選択し、[追加] を選択します。
[ 証明書スナップイン ] ダイアログ ボックスで、[ コンピューター アカウント] を選択し、[ 次へ] を選択します。
コンピューターの選択 ペインで、ローカル コンピューター: (このコンソールが実行されているコンピューター) を選択し、次に Finish を選択します。
[ OK] を 選択して、[ スナップインの追加と削除 ] ダイアログ ボックスを閉じます。
MMC の左側のウィンドウで、 Certificates (ローカル コンピューター) ノードを展開します。
Trusted Root Certification Authorities ノードを展開し、Certificates サブフォルダーを右クリックして、[All Tasks]を選択し、次に[インポート]を選択します。
証明書の インポート ウィザードの [ ようこそ ] ページで、[ 次へ] を選択します。
[インポートするファイルページで、Browse を選択します。
caCert.cer証明書ファイルの場所を参照し、ファイルを選択し、開くを選択します。
File to Import ページで、Next を選択します。
Certificate ストア ページで、既定の選択をそのまま使用し、 Nextを選択します。
証明書のインポート ウィザードの完了 ページで、Finish を選択します。
オプション 2: サーバー証明書を検証せずに信頼する
シナリオ 1 と 2 では、クライアント アプリケーションで 信頼サーバー証明書 の設定を設定します。 この設定では、接続は暗号化された状態を維持しますが、証明書の検証はスキップされます。 キーワード名と受け入れ値は、クライアント ライブラリによって異なります。
| クライアント ライブラリ | 接続文字列キーワード |
|---|---|
Microsoft.Data.SqlClient |
TrustServerCertificate=True |
| Microsoft ODBC Driver for SQL Server (Microsoft SQL Server 用 ODBC ドライバー) | TrustServerCertificate=yes |
| Microsoft OLE DB Driver for SQL Server (プロバイダー文字列) | TrustServerCertificate=yes |
Microsoft OLE DB Driver for SQL Server (ADO またはIDataInitialize) |
Trust Server Certificate=true |
| SQL Server 用 Microsoft JDBC ドライバー | trustServerCertificate=true |
SQL Server Management Studio (SSMS) 20 以降のバージョンを使用して接続する場合は、[サーバーへの接続] ダイアログ ボックスの [ログイン] ページで [信頼サーバー証明書] チェック ボックスをオンにします。 以前のバージョンの SSMS では、[サーバーへの接続] ウィンドウで [オプション] を選択し、[接続のプロパティ] タブを選択し、[サーバー証明書の信頼] を選択します。
クライアント ライブラリに対してこの設定を構成する方法の詳細については、次の記事を参照してください。
- Microsoftにおける暗号化と証明書検証。Data.SqlClient
- OLE DB Driver for SQL Serverでの暗号化と証明書の検証
- ODBC Driver for SQL Server の DSN と接続文字列のキーワードおよび属性
- Microsoft JDBC Driver for SQL Serverを使用した暗号化による接続
- SQL Server Native Client (レガシ クライアント) で検証なしで暗号化を使用する
注
信頼サーバー証明書の設定では、暗号化は無効になりません。 接続は暗号化されたままですが、クライアントはサーバーの ID を確認しません。
Caution
自己署名証明書を使用する暗号化された接続では、強力なセキュリティは提供されません。 中間者攻撃の影響を受けやすくなります。 運用環境またはインターネットに接続されているサーバーでは、自己署名証明書を使用して TLS に依存しないでください。
オプション 3: 暗号化構成を変更する
前のセクションで説明した構成が意図しない場合は、次のいずれかのオプションを使用してこの問題を解決します。
信頼された機関の証明書を使用するようにデータベース エンジンを構成します。 このオプションは、クライアントが追加の構成なしで証明書を検証するため、最も安全な長期的な修正プログラムです。 詳細については、「SQL Serverのデータベース エンジンと証明書の要件への暗号化された接続を有効にする」を参照してください。
暗号化が必要ない場合:
クライアント アプリケーションで暗号化を無効にします。 OLE DB プロバイダー文字列の
Encrypt=Optional、OLE DB ADO またはIDataInitializeのUse Encryption for Data=Optional、ODBC のEncrypt=no、Microsoft.Data.SqlClientまたは Microsoft JDBC Driver のEncrypt=Falseを設定します。 SSMS 20 以降のバージョンでは、[サーバーへの接続] ダイアログ ボックスの [ログイン] ページで [暗号化] を [省略可能] に設定します。SQL Server 構成マネージャーを使用してサーバー側の暗号化を無効にします。 ネットワーク構成SQL Server展開し、<instance 名のプロトコルを右クリックし>プロパティ] を選択し、[フラグ] タブを選択し、[暗号化の強制] を [いいえ] に設定してから、SQL Server サービスを再起動します。 詳細については、「 MSSQLSERVER プロパティのプロトコル ([フラグ] タブ)」を参照してください。
Warning
暗号化を無効にした場合、資格情報とデータは保護されていないネットワーク上を移動します。 信頼された分離されたネットワークでのみ暗号化を無効にします。