この記事では、SQL Server の証明書の要件と、証明書がこれらの要件を満たしているかどうかを確認する方法について説明します。
SQL Server 暗号化の証明書要件
SQL Server 暗号化にトランスポート層セキュリティ (TLS) を使用するには、次の条件を満たす証明書 (3 つのデジタルの種類のいずれか) をプロビジョニングする必要があります。
証明書は、ローカル コンピューター証明書ストアまたは SQL Server サービス アカウント証明書ストアのいずれかに存在する必要があります。 SQL Server スタートアップ アカウントの変更による証明書の再構成を回避するため、ローカル コンピューターの証明書ストアをお勧めします。
SQL Server サービス アカウントには、TLS 証明書にアクセスするために必要なアクセス許可が必要です。 詳細については、「接続を暗号化するために SQL Server データベース エンジンを構成する」を参照してください。
現在のシステム時刻は、証明書のプロパティValid fromの値以後、かつプロパティValid toの値以前である必要があります。 詳細については、「 期限切れの証明書」を参照してください。
注
証明書がサーバー認証に使用されていること。 これには、サーバー認証 (1.3.6.1.5.5.7.3.1) を指定するために、証明書の拡張キー使用法プロパティが必要です。
証明書は、
KeySpec
のAT_KEYEXCHANGE
オプションを使用して作成する必要があります。 これには、 従来の暗号化ストレージ プロバイダー を使用して秘密キーを格納する証明書が必要です。 通常、証明書のキー使用法プロパティ (KEY_USAGE) には、キーの暗号化 (CERT_KEY_ENCIPHERMENT_KEY_USAGE
) とデジタル署名 (CERT_DIGITAL_SIGNATURE_KEY_USAGE
) も含まれます。サブジェクトの別名には、クライアントが SQL Server インスタンスへの接続に使用する可能性があるすべての名前を含める必要があります。
クライアントは、サーバーによって使用される証明書の所有権を確認できる必要があります。 クライアントに、サーバー証明書に署名した証明機関の公開キー証明書がある場合、それ以上の構成は必要ありません。 Microsoft Windows には、多くの証明機関の公開キー証明書が含まれています。 サーバー証明書が公開キー証明書を持たない公開証明機関または秘密証明機関によって署名されている場合は、SQL Server に接続する各クライアントにサーバー証明書に署名した証明機関の公開キー証明書をインストールする必要があります。
重要
コンピューター ストアに証明書が存在する場合、SQL Server は起動しませんが、上記の一覧の一部の要件のみを満たし、SQL Server 構成マネージャーまたはレジストリ エントリで使用するように手動で構成されている場合にのみ使用されます。 すべての要件を満たす別の証明書を選択するか、SQL Server で生成された自己署名証明書で説明されているように、要件を満たす証明書をプロビジョニングするか、自己生成証明書を使用できるようになるまで 、SQL Server で使用されないようにします。
Always On 可用性グループ
SQL Server インスタンスが Always On 可用性グループの一部である場合は、次のいずれかの方法を使用して証明書を作成できます。
方法 1: 可用性グループのすべてのレプリカで 1 つの証明書を使用します。 共通名は任意であるため、任意のプレースホルダー値を指定できます。 可用性グループ内のすべての SQL Server レプリカのホスト名と FQDN、および可用性グループ リスナー名は、証明書の サブジェクトの別名 に含める必要があります。 元の証明書の生成後に可用性グループにレプリカを追加する場合は、すべてのレプリカの名前で証明書を再生成し、各レプリカに 再インポート する必要があります。 証明書は、証明書がパブリックまたは公式の証明機関 (CA) によって署名されていない限り、可用性グループ レプリカまたは可用性グループ リスナーに接続するすべてのクライアントの証明書ストアにも インポート する必要があります。 可用性グループのレプリカとリスナー名を証明書に含めない場合は、可用性グループに接続するときに、に
HostNameInCertificate
のいずれかの値を含める必要があります。または、証明書へのパスを接続文字列のServerCertificate
値に含める必要があります。 証明書で名前を指定することをお勧めします。test1.<your company>.com
とtest2.<your company>.com
という名前の 2 つのサーバーと、aglistener.<your company>.com
という名前の可用性グループ リスナーを持つ可用性グループに対して正しく構成された証明書を定義するプロパティの例を次に示します。CN = <hostname is recommended but not required when certificates are configured using SQL Server Configuration Manager> DNS Name = aglistener.<your company>.com DNS Name = test1.<your company>.com DNS Name = test2.<your company>.com DNS Name = aglistener DNS Name = test1 DNS Name = test2
方法 2: 可用性グループのレプリカごとに個別の証明書を使用します。 証明書の生成後にレプリカを可用性グループに追加する方が、既存のすべてのレプリカのすべての証明書を変更するのではなく、新しいレプリカの証明書を生成するだけで済むため、個別の証明書を使用する方が簡単です。 共通名は任意であるため、任意のプレースホルダー値を指定できます。 各 SQL Server インスタンスのホスト名と FQDN と可用性グループ リスナー名は、それぞれのレプリカの証明書のサブジェクトの別名に含める必要があります。 各証明書をそれぞれのレプリカにインポートし、証明書がパブリックまたは公式の証明機関 (CA) によって署名されていない限り、レプリカまたは可用性グループ リスナーに接続するすべてのクライアント上のすべての証明書ストアにすべての証明書をインポートします。
test1.<your company>.com
とtest2.<your company>.com
という名前の 2 つのインスタンスと、aglistener.<your company>.com
という名前の可用性グループ リスナーを持つ可用性グループに対して正しく構成された証明書を定義するプロパティの例を次に示します。test1 に関する証明書:
CN= <hostname is recommended but not required when certificates are configured using SQL Server Configuration Manager> DNS Name= test1.<your company>.com DNS Name= aglistener.<your company>.com DNS Name= aglistener DNS Name= test1
テスト2の証明書:
CN= <hostname is recommended but not required when certificates are configured using SQL Server Configuration Manager> DNS Name= test2.<your company>.com DNS Name= aglistener.<your company>.com DNS Name= aglistener DNS Name= test2
フェールオーバー クラスター インスタンス
SQL Server が フェールオーバー クラスター インスタンスとして構成されている場合は、フェールオーバー クラスター内のすべてのノードに、ホスト名または仮想サーバーの完全修飾 DNS 名 (FQDN) を含むサーバー証明書をインストールする必要があります。 証明書をフェールオーバー クラスターのすべてのノードにプロビジョニングする必要があります。 たとえば、 test1.<your company>.com
と test2.<your company>.com
という名前のノードを持つ 2 つのノード クラスターがあり、 virtsql という名前の仮想サーバーがある場合は、両方のノードに virtsql.<your company>.com
の証明書をインストールする必要があります。
接続を暗号化するための SQL Server データベース エンジンの構成に関する記事に記載されている順序で、証明書をフェールオーバー クラスターにインポートします。
フェールオーバー クラスター インスタンス用に正しく構成された証明書を定義するプロパティの例を次に示します。
CN = virtsql.<your company>.com
DNS Name = virtsql.<your company>.com
DNS Name = virtsql
SQL クラスターの詳細については、「 フェールオーバー クラスタリングをインストールする前に」を参照してください。
証明書が要件を満たしているかどうかを確認する
SQL Server 2019 (15.x) 以降のバージョンでは、SQL Server Configuration Manager は、構成フェーズ自体の間にすべての証明書要件を自動的に検証します。 証明書の構成後に SQL Server が正常に起動した場合は、SQL Server でその証明書を使用できることを示します。 ただし、一部のクライアント アプリケーションには、暗号化に使用できる証明書に関するその他の要件が残っていて、使用されているアプリケーションによって異なるエラーが発生する場合があります。 このシナリオでは、クライアント アプリケーションのサポート ドキュメントで、この問題の詳細を確認する必要があります。
次のいずれかの方法を使用して、SQL Server で使用する証明書の有効性を確認できます。
sqlcheck ツール:
sqlcheck
は、現在のコンピューターとサービス アカウントの設定を調べ、さまざまな接続エラーのトラブルシューティングに役立つテキスト レポートをコンソール ウィンドウに生成するコマンドライン ツールです。 出力には、証明書に関する次の情報があります。Details for SQL Server Instance: This Certificate row in this section provides more details regarding the certificate being used by SQL Server (Self-generated, hard-coded thumbprint value, etc.). Certificates in the Local Computer MY Store: This section shows detailed information regarding all the certificates found in the computer certificate store.
ツールの機能とダウンロード手順の詳細については、「 CSS_SQL_Networking_Tools Wiki へようこそ」を参照してください。
certutil ツール:
certutil.exe
は、証明書サービスの一部としてインストールされるコマンド ライン プログラムです。 certutil.exe を使用して、証明書情報をダンプおよび表示できます。 詳細な情報を取得するには、-v
オプションを使用します。 詳細については、「certutil」を参照してください。証明書スナップイン: [証明書スナップイン ] ウィンドウを使用して、コンピューター上のさまざまな証明書ストアの証明書に関する詳細情報を表示することもできます。 ただし、このツールには
KeySpec
情報は表示されません。 MMC スナップインで証明書を表示する方法の詳細については、「 方法: MMC スナップインで証明書を表示する」を参照してください。
別の名前の証明書をホスト名にインポートする
現時点では、証明書のサブジェクト名がコンピューターのホスト名と一致する場合にのみ、SQL Server 構成マネージャーを使用して証明書をインポートできます。
別のサブジェクト名の証明書を使用する場合は、次の手順に従います。
証明書スナップインを使用して、ローカル コンピューターの証明書ストアに 証明書をインポートします。
SQL Server 構成マネージャーで、SQL Server ネットワーク構成 を展開し、SQL Server インスタンスを右クリックして、[プロパティ] を選択して、[<instance_name> のプロトコルプロパティ] ダイアログ ボックスを開きます。
[ 証明書 ] タブで、[証明書] ドロップダウン リストから証明書ストアにインポートした 証明書 を選択します。
別の名前の証明書をホスト名にインポートすると、次のエラー メッセージが表示されます。
The selected certificate name does not match FQDN of this hostname. This property is required by SQL Server
Certificate name: random-name
Computer name: sqlserver.___domain.com
期限切れ証明書
SQL Server では、構成時に証明書の有効性のみが確認されます。 たとえば、SQL Server 2019 (15.x) 以降のバージョンの SQL Server 構成マネージャーを使用して、期限切れの証明書をプロビジョニングすることはできません。 SQL Server は、証明書が既にプロビジョニングされた後に有効期限が切れた場合でも、問題なく実行されます。 ただし、Power BI などの一部のクライアント アプリケーションでは、各接続で証明書の有効性が確認され、SQL Server インスタンスが暗号化に期限切れの証明書を使用するように構成されている場合はエラーが発生します。 SQL Server 暗号化には期限切れの証明書を使用しないことをお勧めします。
次のステップ
- 証明書をインポートして接続を暗号化するように SQL Server データベース エンジンを構成します。