エンタープライズ証明書のピン留め
エンタープライズ証明書のピン留めは、ルート発行元証明機関またはエンド エンティティ証明書を特定のドメイン名に記憶またはピン留めするための Windows 機能です。 エンタープライズ証明書のピン留めによって、内部のドメイン名が意図しない証明書や不正に発行された証明書にチェーンするのを防ぐことができ、man-in-the-middle 攻撃を減らすのに役立ちます。
注
外部ドメイン名は、これらのドメインに発行された証明書が公共の証明書機関によって発行されるため、エンタープライズ証明書のピン留めには適切ではありません。
Windows 証明書 API (CertVerifyCertificateChainPolicy と WinVerifyTrust) が更新され、サーバーを認証するサイトのチェーンが制限付き証明書のセットと一致するかどうかを確認します。 これらの制限は、Windows 10 コンピューターに構成および展開されているピン留めルール証明書信頼リスト (CTL) にカプセル化されています。 名前の不一致をトリガーするサイト証明書を使用すると、Windows は CAPI2 イベント ログにイベントを書き込み、Microsoft Edge または Internet Explorer を使用して Web サイトに移動できなくなります。
注
エンタープライズ証明書のピン留め機能のトリガーでは、Microsoft Edge または Internet Explorer 以外のクライアントが接続をブロックすることはありません。
展開
エンタープライズ証明書のピン留めを展開するには、次の操作を行う必要があります。
- 整形式の証明書ピン留めルール XML ファイルを作成する
- XML ファイルからピン留めルール証明書信頼リスト ファイルを作成する
- 参照管理コンピューターにピン留めルール証明書信頼リスト ファイルを適用する
- リモート サーバー管理ツール (RSAT)に含まれているグループ ポリシー管理コンソール (GPMC) を使って、参照コンピューターでレジストリ構成を展開します。
ピン留めルール XML ファイルを作成する
XML ベースのピン留めルール ファイルは、一連の PinRule 要素で構成されます。 各 PinRule 要素には、1 個以上の一連の Site 要素と 0 個以上の一連の Certificate 要素が含まれています。
<PinRules ListIdentifier="PinRulesExample" Duration="P28D">
<PinRule Name="AllCertificateAttributes" Error="None" Log="true">
<Certificate File="Single.cer"/>
<Certificate File="Multiple.p7b"/>
<Certificate File="Multiple.sst"/>
<Certificate Directory="Multiple"/>
<Certificate Base64="MIIBy … QFzuM"/>
<Certificate File="WillExpire.cer" EndDate="2015-05-12T00:00:00Z"/>
<Site Domain="xyz.com"/>
</PinRule>
<PinRule Name="MultipleSites" Log="false">
<Certificate File="Root.cer"/>
<Site Domain="xyz.com"/>
<Site Domain=".xyz.com"/>
<Site Domain="*.abc.xyz.com" AllSubdomains="true"/>
<Site Domain="WillNormalize.com"/>
</PinRule>
</PinRules>
PinRules 要素
PinRules 要素は、次の属性を持つことができます。 ピン留めルールの書式設定については、「XML での日付の表現」または「XML での期間の表現」をご覧ください。
属性 | 説明 | 必須かどうか |
---|---|---|
Duration または NextUpdate | ピン留めルールの有効期限を指定します。 いずれかが必須です。 NextUpdate が優先されます (両方が指定されている場合)。 XML TimeSpan データ型として表される期間では、年と月は許可されません。 NextUpdate 属性は、UTC で XML DateTime データ型として表します。 |
必須かどうか はい。 少なくとも 1 つが必要です。 |
LogDuration または LogEndDate | ピン留めルールの適用を有効期限を超えて延長する場合にのみ監査を構成します。 両方が指定されている場合、LogEndDate (XML DateTime データ型として、UTC で表される) が優先されます。 LogDuration は、年と月を許可しない XML TimeSpan データ型として表します。 'どの属性も指定されていない場合、監査の有効期限には Duration 属性または NextUpdate 属性が使用されます。 |
いいえ、そうではありません。 |
ListIdentifier | ピン留めルールのリストのフレンドリ名を提供します。 Windows では、証明書のピン留め適用にこの属性は使用されません。ただし、ピン規則が証明書信頼リスト (CTL) に変換されるときに含まれます。 | いいえ、そうではありません。 |
PinRule 要素
PinRule 要素は、次の属性を持つことができます。
属性 | 説明 | 必須 |
---|---|---|
名前 | PinRule を一意に識別します。 Windows では、この属性を使用して、解析エラーや詳細な出力の要素を識別します。 属性は、生成された証明書信頼リスト (CTL) には含まれません。 | はい、できます。 |
エラー | PIN の不一致を検出したときに、Windows が実行するアクションを記述します。 次の文字列値の中から選択できます。 - Revoked - Windows は、証明書が失効している場合と同様にサイトを保護する証明書を報告します。 通常、これにより、ユーザーはサイトにアクセスできません。 - InvalidName - 証明書の名前がサイトの名前と一致しないかのように、サイトを保護する証明書が Windows によって報告されます。 通常、この結果、サイトにアクセスする前にユーザーに確認します。 - None - 既定値。 エラーは返されません。 この設定を使用して、ユーザーの介入を必要とせずに、ピン留めルールを監査できます。 |
いいえ、そうではありません。 |
ログ | ブール値は、 true または false と等しい文字列を表 します。 既定では、ログは有効 (true) になります。 | いいえ。 |
Certificate 要素
Certificate 要素は、次の属性を持つことができます。
属性 | 説明 | 必須 |
---|---|---|
ファイル | 1 つまたは複数の証明書を含むファイルへのパス。 証明書は次のようにエンコードできます。 - 単一の証明書 - p7b - sst これらのファイルは Base64 形式にすることもできます。 同じ PinRule 要素に含まれるすべての Site 要素は、これらの証明書のいずれにも対応できます。 |
はい (ファイル、ディレクトリ、または Base64 が存在する必要があります)。 |
Directory | 上記の証明書ファイルの 1 つ以上を含むディレクトリへのパス。 証明書が含まれていないファイルをスキップします。 | はい (ファイル、ディレクトリ、または Base64 が存在する必要があります)。 |
Base64 | Base64 エンコードされた証明書。 証明書は次のようにエンコードできます。 - 単一の証明書 - p7b - sst これにより、ファイルのディレクトリに依存せずに、証明書を XML ファイルに含めることができます。 注: certutil -encode を使用して、.cer ファイルを base64 に変換できます。 次に、メモ帳を使用して、base64 でエンコードされた証明書をコピーし、ピン留めルールに貼り付けます。 |
はい (ファイル、ディレクトリ、または Base64 が存在する必要があります)。 |
Enddate | 証明書がピン留めルールで有効ではなくなる有効期限の日付を構成できます。 新しいルートまたは CA への切り替えの処理中である場合、EndDate を設定することによって、この要素の証明書を対応させることができます。 現在の時刻が EndDate を過ぎた場合、証明書信頼リスト (CTL) を作成するときに、パーサーは警告メッセージを出力し、生成された CTL の Pin 規則から証明書を除外します。 ピン留めルールの書式設定については、「XML での日付の表現」をご覧ください。 |
いいえ。 |
Site 要素
Site 要素は、次の属性を持つことができます。
属性 | 説明 | 必須 |
---|---|---|
ドメイン | このピン留めルールに合致する DNS 名を格納します。 証明書信頼リストを作成するときに、パーサーは次のように入力名の文字列値を正規化します。 - DNS 名に先頭の "*" がある場合は、削除されます。 - ASCII 以外の DNS 名が ASCII Puny Code に変換されます。 - 大文字の ASCII 文字は小文字に変換されます。 正規化された名前に先頭の "." がある場合は、ワイルドカードの左側のラベルの照合が有効になります。 たとえば、".xyz.com" は "abc.xyz.com" とマッチします。 |
はい、できます。 |
AllSubdomains | 既定では、ワイルドカードの左側のラベルの一致は、1 つの左側のラベルに制限されます。 この属性を "true" に設定することで、左側のすべてのラベルでワイルドカード マッチングが有効になります。 たとえば、この属性を設定することで、".xyz.com" ドメイン値に "123.abc.xyz.com" もマッチするようになります。 |
いいえ。 |
ピン留めルールの証明書信頼リストを作成する
コマンド ライン ユーティリティ Certutil.exe には、XML ファイルを解析し、エンコードされた証明書信頼リスト (CTL) を生成する generatePinRulesCTL 引数が含まれています。生成された CTL を Windows 10 Version 1703 参照コンピューターに追加し、後で展開します。 使用構文は次のとおりです。
CertUtil [Options] -generatePinRulesCTL XMLFile CTLFile [SSTFile]
Generate Pin Rules CTL
XMLFile -- input XML file to be parsed.
CTLFile -- output CTL file to be generated.
SSTFile -- optional .sst file to be created.
The .sst file contains all of the certificates
used for pinning.
Options:
-f -- Force overwrite
-v -- Verbose operation
同じ証明書を複数の PinRule 要素で指定できます。 同じドメインを複数の PinRule 要素で指定できます。 Certutil はこれらをまとめて、ピン留めルールの証明書信頼リストを生成します。
Certutil.exeでは、XML スキーマ定義が厳密に適用されるわけではありません。 次の処理を行って、他のツールが独自の特定の要素と属性を追加/利用できるようにします。
- PinRules 要素の前後の要素をスキップします。
- PinRules 要素内の Certificate または Site に一致しない要素をスキップします。
- 要素の種類ごとに、上記の名前と一致しない属性をスキップします。
certutil コマンドで generatePinRulesCTL 引数と共に、証明書のピン留めルールを含む XML ファイルを指定します。 最後に、証明書信頼リストの形式で証明書のピン留めルールを含む出力ファイルの名前を指定します。
certutil -generatePinRulesCTL certPinRules.xml pinrules.stl
証明書のピン留めルールを参照コンピューターに適用する
証明書のピン留めルールが証明書信頼リスト形式になったら、社内に設定を展開するための前提条件として、参照コンピューターに設定を適用する必要があります。 展開構成を簡略化するには、リモート サーバー管理ツール (RSAT) に含まれるグループ ポリシー管理コンソール (GPMC) を持つコンピューターに証明書のピン留め規則を適用することをお勧めします。
certutil.exe で setreg引数を使用して、証明書のピン留めルールを参照コンピューターに適用します。 setreg 引数は、certutil が証明書のピン留めルールを書き込む場所を決定するセカンダリ引数を受け取ります。 このセカンダリ引数が chain\PinRules です。 最後に指定する引数は、証明書信頼リスト形式 (.stl) で証明書のピン留めルールを格納するファイルの名前です。 このファイルの名前を最後の引数として渡します。ただし、次の例に示すように、"@" 記号を使ってファイル名にプレフィックスを付ける必要があります。 管理者特権のコマンド プロンプトからこのコマンドを実行する必要があります。
Certutil -setreg chain\PinRules @pinrules.stl
certutil は、次の登録場所にバイナリ情報を書き込みます。
名前 | 値 |
---|---|
キー | HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config |
名前 | PinRules |
値 | 証明書のピン留めルールの証明書信頼リスト ファイルのバイナリの内容 |
データの種類 | REG_BINARY |
グループ ポリシーを使用してエンタープライズ ピン留めルールの設定を展開する
証明書のピン留めルールの XML ファイルを正しく作成しました。 XML ファイルから、信頼リスト ファイルをピン留めする証明書を作成し、そのファイルの内容を参照コンピューターに適用し、グループ ポリシー管理コンソールを実行できます。 次に、適用された証明書のピン留めルールの設定を含むグループ ポリシー オブジェクトを構成し、そのオブジェクトを環境に展開する必要があります。
ドメイン管理者と同等の資格情報を使用して、参照コンピューターにサインインします。
グループ ポリシー管理コンソール (gpmc.msc) を開始します。
ナビゲーション ウィンドウで、フォレスト ノードを展開し、ドメイン ノードを展開します。
Active Directory のドメイン名を含むノードを展開します
グループ ポリシー オブジェクト ノードを選択します。 グループ ポリシー オブジェクト ノードを右クリックし、[新規] をクリックします。
[新しいGPO] ダイアログ ボックスで、[名前] テキスト ボックスに「Enterprise Certificate Pinning Rules」と入力し、[OK] をクリックします。
コンテンツ ウィンドウで、Enterprise Certificate Pinning Rules グループ ポリシー オブジェクトを右クリックし、[編集] をクリックします。
グループ ポリシー管理エディターのナビゲーション ウィンドウで、[コンピューターの構成] の下の [基本設定]ノードを展開します。 [Windows の設定] を展開します。
[レジストリ] ノードを右クリックし、[新規] をクリックします。
[新しいレジストリのプロパティ] ダイアログ ボックスで、[アクション] の一覧から [更新] を選択します。 [ハイブ] の一覧から [HKEY_LOCAL_MACHINE] を選択します。
[キー パス] で [...] をクリックして、レジストリ項目ブラウザーを起動します。 次のレジストリ キーに移動し、レジストリ値の名前 [PinRules] を選択します。
HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config
[選択] をクリックして、レジストリ項目ブラウザーを閉じます。
[キーのパス] に選択したレジストリ キーが含まれています。 値名の構成には、レジストリ値の名前 PinRules が含まれている必要があります。 値の型 は REG_BINARY を読み取る必要があります。 Value データ には、0 から 9 までの長い一連の数値と、A から F (16 進数) までの文字が含まれている必要があります。 [OK] をクリックして設定を保存し、ダイアログ ボックスを閉じます。
グループ ポリシー管理エディターを閉じて、設定を保存します。
Enterprise Certificate Pinning Rules グループ ポリシー オブジェクトにリンクして、社内で Windows 10 Version 1703 を実行するコンピューターに適用します。 これらのドメインに参加しているコンピューターがグループ ポリシーを適用すると、グループ ポリシー オブジェクトで構成されたレジストリ情報がコンピューターに適用されます。
追加のピン留めルールのログ記録
証明書のピン留めルールの作成を容易にするために、証明書チェーンの構成レジストリ キーの下に PinRulesLogDir 設定を構成して、ピン留めルールのログを記録するための親ディレクトリを含めることができます。
名前 | 値 |
---|---|
キー | HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config |
名前 | PinRulesLogDir |
値 | Windows が追加のピン留めルールのログを書き込む親ディレクトリ |
データの種類 | REG_SZ |
ピン留めルールのログ フォルダーのアクセス許可
Windows が追加のピン留めルールのログを書き込むフォルダーは、すべてのユーザーやアプリケーションがフル アクセスを持つようにアクセス許可を設定する必要があります。 管理者特権のコマンド プロンプトから次のコマンドを実行して、適切なアクセス許可を取得できます。
set PinRulesLogDir=c:\PinRulesLog
mkdir %PinRulesLogDir%
icacls %PinRulesLogDir% /grant *S-1-15-2-1:(OI)(CI)(F)
icacls %PinRulesLogDir% /grant *S-1-1-0:(OI)(CI)(F)
icacls %PinRulesLogDir% /grant *S-1-5-12:(OI)(CI)(F)
icacls %PinRulesLogDir% /inheritance:e /setintegritylevel (OI)(CI)L
アプリケーションが、サーバー証明書の DNS 名と一致するサーバー名を含む TLS/SSL 証明書チェーンを確認したときに、Windows は、サーバーのチェーンにあるすべての証明書から成る .p7b ファイルを、3 つの子フォルダーのいずれかに書き込みます。
- AdminPinRules エンタープライズ証明書のピン留めルール内のサイトに一致しました。
- AutoUpdatePinRules Microsoftによって管理される証明書のピン留めルール内のサイトに一致しました。
- NoPinRules 証明書ピン規則のどのサイトにも一致しませんでした。
出力ファイル名は、ルートの SHA1 拇印の先頭 8 桁の ASCII 16 進数字と、サーバー名で構成されます。 次に、例を示します。
D4DE20D0_xsi.outlook.com.p7b
DE28F4A4_www.yammer.com.p7b
エンタープライズ証明書ピン規則またはMicrosoft証明書ピン規則の不一致がある場合、Windows は .p7b ファイルを MismatchPinRules 子フォルダーに書き込みます。 ピン留めルールの有効期限が切れている場合、Windows は .p7b ファイルを ExpiredPinRules 子フォルダーに書き込みます。
XML での日付の表現
ピン留めルールの xml ファイル内の多くの属性は日付です。
これらの日付は、正しく書式設定され、UTC で表されている必要があります。
Windows PowerShell を使用して、これらの日付の書式を設定できます。
次に、コマンドレットの出力をコピーして、XML ファイルに貼り付けることができます。
わかりやすくするために、小数点 (.) とその後の数字を切り捨てることができます。 ただし、必ず XML 日付文字列の末尾に大文字 "Z" を追加してください。
2015-05-11T07:00:00.2655691Z
2015-05-11T07:00:00Z
XML の日付の変換
また、Windows PowerShellを使用して XML 日付を検証し、人間が判読できる日付に変換して、正しい日付を検証することもできます。
XML での期間の表現
一部の要素は、日付ではなく期間を使用するように構成できます。 期間は XML timespan データ型として表す必要があります。 Windows PowerShell を使用して、期間 (timespan) を正しく書式設定して検証し、結果をコピーして XML ファイルに貼り付けることができます。
XML の期間の変換
XML 形式のタイムスパンを、読み取り可能なタイムスパン変数に変換できます。
証明書信頼リストの XML スキーマ定義 (XSD)
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="PinRules">
<xs:complexType>
<xs:sequence>
<xs:element name="PinRule" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="Certificate" maxOccurs="unbounded" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:dateTime" name="EndDate" use="optional"/>
<xs:attribute type="xs:string" name="File" use="optional"/>
<xs:attribute type="xs:string" name="Directory" use="optional"/>
<xs:attribute type="xs:base64Binary" name="Base64" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="Site" maxOccurs="unbounded" minOccurs="1">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="Domain"/>
<xs:attribute type="xs:boolean" name="AllSubdomains" use="optional" default="false"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="Name"/>
<xs:attribute name="Error" use="optional" default="None">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value ="Revoked"/>
<xs:enumeration value ="InvalidName"/>
<xs:enumeration value ="None"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute type="xs:boolean" name="Log" use="optional" default="true"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:duration" name="Duration" use="optional"/>
<xs:attribute type="xs:duration" name="LogDuration" use="optional"/>
<xs:attribute type="xs:dateTime" name="NextUpdate" use="optional"/>
<xs:attribute type="xs:dateTime" name="LogEndDate" use="optional"/>
<xs:attribute type="xs:string" name="ListIdentifier" use="optional"/>
</xs:complexType>
</xs:element>
</xs:schema>