この記事では、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) を指定するために、証明書の拡張キー使用法プロパティが必要です。
証明書は、の オプションを使用して作成する必要があります。 これには、 従来の暗号化ストレージ プロバイダー を使用して秘密キーを格納する証明書が必要です。 通常、証明書のキー使用法プロパティ (KEY_USAGE) には、キーの暗号化 () とデジタル署名 () も含まれます。
Subject の別名には、クライアントが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、および可用性グループ リスナー名は、証明書の Subject 代替名に含める必要があります。 元の証明書の生成後に可用性グループにレプリカを追加する場合は、すべてのレプリカの名前で証明書を再生成し、各レプリカに 再インポート する必要があります。 証明書は、証明書がパブリックまたは公式の証明機関 (CA) によって署名されていない限り、可用性グループ レプリカまたは可用性グループ リスナーに接続するすべてのクライアントの証明書ストアにも インポート する必要があります。 可用性グループのレプリカとリスナー名を証明書に含めない場合は、 に
HostNameInCertificateのいずれかの値を含める必要があります。または、可用性グループに接続するときに、接続文字列のServerCertificate値の証明書へのパスを含める必要があります。 証明書で名前を指定することをお勧めします。とという名前の 2 つのサーバーと、という名前の可用性グループ リスナーを持つ可用性グループに対して正しく構成された証明書を定義するプロパティの例を次に示します。
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) によって署名されていない限り、レプリカまたは可用性グループ リスナーに接続するすべてのクライアント上のすべての証明書ストアにすべての証明書をインポートします。
とという名前の 2 つのインスタンスと、という名前の可用性グループ リスナーを持つ可用性グループに対して正しく構成された証明書を定義するプロパティの例を次に示します。
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が failover クラスター インスタンス として構成されている場合は、フェールオーバー クラスター内のすべてのノードに、ホスト名または仮想サーバーの完全修飾 DNS 名 (FQDN) を含むサーバー証明書をインストールする必要があります。 証明書をフェールオーバー クラスターのすべてのノードにプロビジョニングする必要があります。 たとえば、 と という名前のノードを持つ 2 つのノード クラスターがあり、 virtsql という名前の仮想サーバーがある場合は、両方のノードに の証明書をインストールする必要があります。
接続を暗号化するための Configure SQL Server データベース エンジン に記載されている順序で、証明書をフェールオーバー クラスターにインポートします。
フェールオーバー クラスター インスタンス用に正しく構成された証明書を定義するプロパティの例を次に示します。
CN = virtsql.<your company>.com
DNS Name = virtsql.<your company>.com
DNS Name = virtsql
SQL クラスターの詳細については、「 フェールオーバー クラスタリングをインストールする前に」を参照してください。
証明書が要件を満たしているかどうかを確認する
SQL Server 2019 (15.x) 以降のバージョンでは、SQL Server 構成マネージャーは構成フェーズ自体の間にすべての証明書要件を自動的に検証します。 SQL Server に証明書を構成した後で正常に開始されたら、SQL Server がその証明書を使用できることを示しています。 ただし、一部のクライアント アプリケーションには、暗号化に使用できる証明書に関するその他の要件が残っていて、使用されているアプリケーションによって異なるエラーが発生する場合があります。 このシナリオでは、クライアント アプリケーションのサポート ドキュメントで、この問題の詳細を確認する必要があります。
KeySpec とキーの使用状況を確認する
要件 () は、証明書構成エラーの一般的な原因です。 証明書がこの要件を満たしていることを確認するには、次の方法を使用します。
certutil を使用する
やなど、詳細な証明書のプロパティを表示するには、 オプションを使用してを実行します。
certutil -v -store My "<certificate_thumbprint>"
出力で、次の値を探します。
KeySpec = 1 -- AT_KEYEXCHANGE
Key Usage = Key Encipherment, Digital Signature (a0)
Enhanced Key Usage:
Server Authentication (1.3.6.1.5.5.7.3.1)
KeySpec = 2 (AT_SIGNATURE) の場合、SQL Server暗号化には証明書を使用できません。
PowerShell の使用
次の PowerShell コマンドを実行して、ローカル コンピューター ストア内の証明書の を確認します。
Get-ChildItem Cert:\LocalMachine\My | ForEach-Object {
$cert = $_
$key = $cert.PrivateKey
[PSCustomObject]@{
Subject = $cert.Subject
Thumbprint = $cert.Thumbprint
KeySpec = if ($key) { $key.CspKeyContainerInfo.KeyNumber } else { 'No private key' }
NotAfter = $cert.NotAfter
}
} | Format-Table -AutoSize
に (に対応) が表示されていることを確認します。 が表示されている場合は、適切な設定で新しい証明書を要求します。
AD CS を使用して証明書を作成する
Active Directory Certificate Services (AD CS) を内部証明機関 (CA) として使用している場合は、次の手順に従って、SQL Server要件を満たす証明書を作成します。
- ローカル コンピューター () の証明書 MMC スナップインを開きます。
- [個人用] を展開し、[証明書] を右クリックし、[すべてのタスク] [新しい証明書の要求] を選択します。
- Active Directory登録ポリシーを選択し、Next を選択します。
- サーバー認証をサポートする証明書テンプレートを選択します。 通常、サーバー認証用に構成された Web サーバー またはカスタム テンプレートが要件を満たしています。 テンプレートがキー ストレージ プロバイダー (KSP) ではなく、 を持つ従来の暗号化サービス プロバイダー (CSP) を使用していることを CA 管理者に確認します。
- [ 証明書のプロパティ] ページで、次の手順を実行します。
- Common Name (CN) を、SQL Server インスタンスのホスト名または FQDN に設定します。
- [ サブジェクトの別名 ] タブで、クライアントが接続に使用するすべてのホスト名 (ホスト名、FQDN、エイリアス) の DNS エントリを追加します。
- 登録ウィザードを完了し、新しい証明書が PersonalCertificates に表示されていることを確認します。
- KeySpec とキー使用法の確認の説明に従って、certutil または PowerShell を使用してを確認します。
重要
Microsoft ソフトウェア キー ストレージ プロバイダー などのキー ストレージ プロバイダー (KSP) で作成された証明書は、KeySpec = 0 を使用し、SQL Serverと互換性がありません。 AD CS で証明書テンプレートを作成する場合は、Microsoft RSA SChannel 暗号化プロバイダーなどのレガシ CSP を選択することにより、互換性を確保します。
次のいずれかの方法を使用して、SQL Serverで使用する証明書の有効性を確認できます。
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」を参照してください。
証明書スナップイン: [証明書スナップイン ] ウィンドウを使用して、コンピューター上のさまざまな証明書ストアの証明書に関する詳細情報を表示することもできます。 ただし、このツールには 情報は表示されません。 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 データベース エンジンを構成します。
関連コンテンツ
- TLS 1.3 のサポート
- TLS 1.3 の構成