エンタープライズ証明書のピン留めの概要

エンタープライズ証明書のピン留めは、ドメイン名への記憶 (ピン留め)、ルート発行元証明機関、またはエンド エンティティ証明書を記憶するための Windows 機能です。
この機能は、内部ドメイン名が不要な証明書や不正に発行された証明書へのチェーンから保護することで、中間者攻撃を減らすのに役立ちます。

外部ドメイン名は、これらのドメインに発行された証明書が公共の証明書機関によって発行されるため、エンタープライズ証明書のピン留めには適切ではありません。

サーバーを認証するサイトのチェーンが制限された証明書のセットと一致する場合、Windows 証明書 API (CertVerifyCertificateChainPolicyWinVerifyTrust) がチェックに更新されます。
制限は、Windows デバイスに構成および展開される Pin Rules Certificate Trust List (CTL) にカプセル化されます。
名前の不一致をトリガーするサイト証明書を使用すると、Windows は CAPI2 イベント ログにイベントを書き込み、ユーザーが Web サイトを閲覧できなくなります。

エンタープライズ証明書のピン留め機能のトリガーでは、Microsoft Edge 以外のクライアントが接続をブロックすることはありません。

展開

エンタープライズ証明書のピン留めを展開するには、次の操作を行う必要があります。

  • 整形式の証明書ピン留めルール XML ファイルを作成する
  • XML ファイルからピン留めルール証明書信頼リスト ファイルを作成する
  • 参照管理コンピューターにピン留めルール証明書信頼リスト ファイルを適用する
  • グループ ポリシーを使用して参照コンピューターにレジストリ構成を展開する

ピン規則 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 コマンドには、generatePinRulesCTL 引数が含まれています。 引数は XML ファイルを解析し、参照 Windows デバイスに追加して展開するエンコードされた証明書信頼リスト (CTL) を生成します。 構文は次のとおりです。

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 は、結果のピン 規則証明書信頼リストでこれらを結合します
  • xml スキーマ定義を厳密に適用しない Certutil.exe

Certutil では、次の操作を実行して、他のツールが独自の特定の要素と属性を追加または使用できるようにします。

  • PinRules 要素の前後の要素をスキップします
  • PinRules 要素内の Certificate または Site に一致しない要素をスキップします
  • 要素の種類ごとに上記の名前と一致しない属性をスキップします

certutil コマンドで generatePinRulesCTL 引数と共に、証明書のピン留めルールを含む XML ファイルを指定します。 最後に、証明書信頼リストの形式で証明書のピン留めルールを含む出力ファイルの名前を指定します。

certutil -generatePinRulesCTL certPinRules.xml pinrules.stl

証明書のピン留め規則を参照コンピューターに適用する

証明書のピン留めルールが証明書信頼リスト形式になったら、社内に設定を展開するための前提条件として、参照コンピューターに設定を適用する必要があります。 展開構成を簡略化するには、リモート サーバー管理ツール (RSAT) に含まれるグループ ポリシー管理コンソール (GPMC) を持つコンピューターに証明書のピン留め規則を適用することをお勧めします。

certutil.exesetreg引数を使用して、証明書のピン留めルールを参照コンピューターに適用します。
setreg 引数は、certutil が証明書のピン留めルールを書き込む場所を決定するセカンダリ引数を受け取ります。
セカンダリ引数は chain\PinRules です
最後に指定する引数は、証明書の信頼リスト形式 (.stl) で証明書のピン留め規則を含むファイルの名前です。
ファイルの名前を最後の引数として渡します。 次の例のように、ファイル名の先頭に記号を @ 付けます。

Certutil -setreg chain\PinRules @pinrules.stl

管理者特権のコマンド プロンプトからコマンドを実行する必要があります。

certutil は、次の登録場所にバイナリ情報を書き込みます。

名前
キー HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config
名前 PinRules
証明書のピン留めルールの証明書信頼リスト ファイルのバイナリの内容
データの種類 REG_BINARY

レジストリ バイナリ情報。

グループ ポリシーを使用してエンタープライズピンルール設定を展開する

XML ファイルから、信頼リスト ファイルをピン留めする証明書を作成しました。 次に、グループ ポリシー管理コンソールを実行できる参照デバイスにファイルの内容を適用しました。

次の手順では、適用された証明書ピン規則の設定を含むグループ ポリシー オブジェクトを構成し、環境に展開します。

ドメイン管理者と同等の資格情報を使用して、参照コンピューターにサインインします。

  1. グループ ポリシー管理コンソール (gpmc.msc) を開始します。
  2. ナビゲーション ウィンドウで、フォレスト ノードを展開し、ドメイン ノードを展開します
  3. Active Directory のドメイン名を含むノードを展開します
  4. グループ ポリシー オブジェクト ノードを選択します。 [グループ ポリシー オブジェクト] ノードを右クリックし、[新規] を選択します。
  5. [新しい GPO] ダイアログ ボックスの [名前] テキスト ボックスに「Enterprise Certificate Pinning Rules」と入力し、[OK] を選択します
  6. コンテンツ ウィンドウで、エンタープライズ証明書のピン留めルール グループ ポリシー オブジェクトを右クリックし、[編集] を選択します
  7. グループ ポリシー管理エディターのナビゲーション ウィンドウで、[コンピューターの構成] の下の [基本設定]ノードを展開します。 [Windows 設定] を展開する
  8. [レジストリ] ノードを右クリックし、[新規] を選択します
  9. [新しいレジストリのプロパティ] ダイアログ ボックスで、[アクション] の一覧から [更新] を選択します。 [Hive] ボックスの一覧から [HKEY_LOCAL_MACHINE] を選択します
  10. [キー パス] で [...] を選択して、レジストリ項目ブラウザーを起動します。 次のレジストリ キーに移動し、レジストリ値の名前 [PinRules] を選択します。

HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config

[選択] を選択してレジストリ項目ブラウザーを閉じます

  1. [キーのパス] に選択したレジストリ キーが含まれています。 値名の構成には、レジストリ値の名前 PinRules が含まれている必要があります。 値の型REG_BINARY を読み取る必要があります。 Value データ には、0 から 9 までの長い一連の数値と、A から F (16 進数) までの文字が含まれている必要があります。 [ OK] を選択 して設定を保存し、ダイアログ ボックスを閉じます

PinRules プロパティ。

  1. グループ ポリシー管理エディターを閉じて設定を保存する
  2. エンタープライズ証明書ピン留め規則 GPO を、構成するデバイスを含む OU にリンクする

追加のピン規則のログ記録

証明書のピン留め規則を構築するために、証明書チェーン構成レジストリ キーの下にある PinRulesLogDir 設定を構成して、ピン規則をログに記録する親ディレクトリを含めることができます。

名前
キー HKLM\SOFTWARE\Microsoft\Cryptography\OID\EncodingType0\CertDllCreateCertificateChainEngine\Config
名前 PinRulesLogDir
Windows が追加のピン留めルールのログを書き込む親ディレクトリ
データの種類 REG_SZ

暗証番号 (pin) ルール ログ フォルダーのアクセス許可

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 で期間を表す

一部の要素は、日付ではなく期間を使用するように構成できます。 期間は XML timespan データ型として表す必要があります。 Windows PowerShell を使用して、期間 (timespan) を正しく書式設定して検証し、結果をコピーして XML ファイルに貼り付けることができます。

期間を表します。

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>