企業憑證釘選概觀

企業憑證釘選是一項 Windows 功能,可記住 (將) 、跟證書頒發機構單位或終端實體憑證釘選到功能變數名稱。
此功能可藉由保護內部功能變數名稱不受鏈結至垃圾或詐騙發行的憑證,協助減少攔截式攻擊。

注意

將憑證發給這些網域的外部網域名稱是由公開憑證授權單位所核發,因此不適用於企業憑證關聯。

(CertVerifyCertificateChainPolicyWinVerifyTrust) 的 Windows 憑證 API 會更新,以檢查驗證伺服器的網站鏈結是否符合一組受限制的憑證。
這些限制會封裝在已設定並部署至 Windows 裝置的 PIN 規則憑證信任清單 (CTL) 中。
任何觸發名稱不符的網站憑證都會造成 Windows 將事件寫入 CAPI2 事件記錄檔,並防止使用者瀏覽網站。

注意

企業憑證釘選功能觸發不會造成 Microsoft Edge 以外的用戶端封鎖連線。

部署

若要部署企業憑證關聯,您必須︰

  • 建立格式正確的憑證關聯規則 XML 檔
  • 從 XML 檔建立關聯規則憑證信任清單檔案
  • 將關聯規則憑證信任清單檔案套用至參照管理電腦
  • 透過組策略在參照電腦上部署登錄設定

建立釘選規則 XML 檔案

XML 格式的關聯規則檔案是由 PinRule 項目的序列所組成。 每個 PinRule 項目都包含一個或多個「網站」項目的序列,以及零個或多個「憑證」項目的序列。

<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 中代表持續時間

屬性 描述 必要
DurationNextUpdate 指定釘選規則到期的時間。 需要其中一種。 如果已指定兩者,則NextUpdate 優先。
以 XML TimeSpan 資料類型表示的持續時間不允許年份和月份。 您將 NextUpdate 屬性表示為 UTC 中的 XML DateTime 資料類型。
必要? 是。 至少需要一個。
LogDurationLogEndDate 設定稽核僅延伸至超過強制執行關聯規則的到期日。
LogEndDate,表示為 UTC 格式的 XML DateTime 資料類型,且在兩者皆指定時優先使用。
您將 LogDuration 表示為 XML TimeSpan 資料類型,不允許年份和月份。
如果未指定任何屬性,則稽核到期會使用 DurationNextUpdate 屬性。
否。
ListIdentifier 提供關聯規則清單的易記名稱。 Windows 不會使用此屬性來強制執行憑證釘選;不過,當釘選規則轉換成憑證信任清單 (CTL) 時,就會包含它。 否。

PinRule 元素

PinRule 項目具有下列屬性。

屬性 描述 必要
名稱 唯一識別 PinRule。 Windows 會使用 屬性來識別剖析錯誤或詳細資訊輸出的專案。 屬性不包含在產生的憑證信任清單中, (CTL) 。 是。
錯誤 說明 Windows 在發生 PIN 不相符時執行的動作。 您可以選擇下列字串值:
- Revoked - Windows 回報憑證以撤銷方式保護網站。 這通常可防止使用者存取網站。
- InvalidName - Windows 報告保護網站的憑證,就像憑證上的名稱不符合網站名稱一樣。 這通常會讓系統提示使用者是否要存取網站。
- None - 預設值。 未傳回錯誤。 您可以使用 設定來稽核釘選規則,而不會造成任何使用者摩擦。
否。
記錄檔 布爾值代表等於 truefalse 的字串。 預設會啟用記錄 (true)。 否。

Certificate 項目

Certificate 項目具有下列屬性。

屬性 描述 必要
檔案 包含一個或多個憑證的檔案路徑。 其中的憑證可編碼為:
- single certificate
- p7b
- sst
這些檔案也可以是 Base64 的格式。 所有包含在相同 PinRule 項目的 Site 項目皆符合這些憑證。
是 (檔案、目錄或Base64必須出現在) 。
目錄 包含一個或多個上述憑證檔案的目錄路徑。 略過所有不包含任何憑證的檔案。 是 (檔案、目錄或Base64必須出現在) 。
Base64 Base64 編碼憑證。 其中的憑證可編碼為:
- single certificate
- p7b
- sst
這可讓憑證包含在 XML 檔中而不需要檔案目錄相依性。
注意:
您可以使用 certutil -encode 將 .cer 檔案轉換成 base64。 然後使用記事本將 base64 編碼的憑證複製及貼上至關聯規則。
是 (檔案、目錄或Base64必須出現在) 。
EndDate 可讓您設定憑證在關聯規則中不再有效的到期日。
如果您正在切換至新的根目錄或 CA,您可以設定 EndDate 以允許比對此元素的憑證。
如果目前時間超過 EndDate,則在 CTL (建立憑證信任清單時) 剖析器會輸出警告訊息,並將憑證 (的) 從產生的 CTL 中的釘選規則中排除。
如需設定釘選規則格式的說明,請 參閱在 XML 中表示日期
否。

Site 項目

Site 項目具有下列屬性。

屬性 描述 必要
網域 包含要比對此關聯規則的 DNS 名稱。 當您建立憑證信任清單時,剖析器會正規化輸入名稱字串值,如下所示:
- 如果 DNS 名稱具有前置 「*」 則會將其移除。
- 非 ASCII DNS 名稱會轉換成 ASCII Puny Code。
- 大寫 ASCII 字元會轉換至小寫。
如果正規化名稱具有前置 “.”,則會啟用通配符左側卷標比對。 例如,「.xyz.com」會比對「abc.xyz.com」。
是。
AllSubdomains 根據預設,左側的通配符卷標比對會限制為單一左側標籤。 此屬性可設為「true」以啟用所有左側標籤的萬用字元比對。
例如,設定此屬性也會比對適用於「.xyz.com」網域值的「123.abc.xyz.com」。
否。

建立 Pin 規則憑證信任清單

Certutil.exe 命令包含 generatePinRulesCTL 自變數。 自變數會剖析 XML 檔案,併產生編碼的憑證信任清單, (CTL) 您新增至參考 Windows 裝置,然後部署。 語法為:

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 架構定義

Certutil 會執行下列動作,讓其他工具能夠新增/取用自己的特定元素和屬性:

  • 略過 PinRules 元素前後的專案
  • 略過 PinRules 元素內任何不符合 CertificateSite 的專案
  • 針對每個項目類型略過不符合上述名稱的任何屬性

使用 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 檔案建立憑證釘選信任清單檔案。 然後,您已將檔案的內容套用至參考裝置,您可以從中執行 群組原則 管理主控台。

下一個步驟包含設定組策略物件,其中包含套用的憑證釘選規則設定,並將它部署在您的環境中。

使用與網域系統管理員相同的憑證登入參照電腦。

  1. 啟動群組原則管理主控台 (gpmc.msc)
  2. 在瀏覽窗格中,展開樹系節點,然後展開網域節點
  3. 展開包含 Active Directory 功能變數名稱的節點
  4. 選取 \[群組原則物件\] 節點。 以滑鼠右鍵按兩下 群組原則物件節點,然後選取[新增]
  5. 在 [新增 GPO] 對話方塊的 [名稱] 文字框中輸入企業憑證釘選規則,然後選取 [確定]
  6. 在內容窗格中,以滑鼠右鍵按兩下 [企業憑證釘選規則] 群組原則 對象,然後選取 [編輯]
  7. \[群組原則編輯器\] 的瀏覽窗格中,展開\[電腦設定\] 下方的 \[Preferences Setup\] (喜好設定) 節點。 展開 [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 (十六進位) 範圍的字母。 選取 [確定 ] 以儲存您的設定並關閉對話框

PinRules 屬性。

  1. 關閉 群組原則 管理 編輯器 以儲存您的設定
  2. 企業憑證釘選規則 GPO 連結至包含您要設定之裝置的 OU

其他釘選規則記錄

為了協助建構憑證釘選規則,您可以在憑證鏈結組態登錄機碼下設定 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

當應用程式驗證包含伺服器名稱的 TLS/SSL 憑證鏈結符合伺服器證書中的 DNS 名稱時,Windows 會將包含伺服器鏈結中所有憑證的 .p7b 檔案寫入三個子資料夾的其中一個:

  • AdminPinRules:符合企業憑證釘選規則中的網站
  • AutoUpdatePinRules:在 Microsoft 管理的憑證釘選規則中比對網站
  • NoPinRules:不符合憑證釘選規則中的任何網站

輸出檔名包含根目錄 SHA1 指紋的前八個 ASCII 十六進位數位,後面接著伺服器名稱。 例如:

  • D4DE20D0_xsi.outlook.com.p7b
  • DE28F4A4_www.yammer.com.p7b

如果企業憑證釘選規則或 Microsoft 憑證釘選規則不相符,則 Windows 會將 .p7b 檔案寫入 MismatchPinRules 子資料夾。 如果關聯規則已到期,則 Windows 會將 .p7b 寫入 ExpiredPinRules 子資料夾。

代表 XML 中的日期

關聯規則 xml 檔案中的許多屬性皆為日期。
這些日期在 UTC 中的格式和表示方式必須正確無誤。
您可以使用 Windows PowerShell 格式化這些日期。
然後您可以將 Cmdlet 的輸出複製及貼上至 XML 檔案。

表示日期。

為求簡化,您可以截斷小數點 (.) 及其後方的數字。 不過,請務必將大寫 「Z」 附加至 XML 日期字串的結尾。

2015-05-11T07:00:00.2655691Z
2015-05-11T07:00:00Z

轉換 XML 日期

您也可以使用 Windows PowerShell 來驗證 XML 日期,並將其轉換成人類可讀取的日期,以驗證它是正確的日期。

轉換 XML 日期。

表示 XML 中的持續時間

某些項目可設定為使用持續時間而非日期。 您必須將持續時間表示為 XML timespan 資料類型。 您可以使用 Windows PowerShell 以正確格式化及驗證持續時間 (timespans),並將其複製及貼上至 XML 檔。

表示持續時間。

轉換 XML 持續時間

您可以將 XML 格式化的時間範圍轉換成您可以讀取的時間範圍變數。

轉換 XML 持續時間。

XSD) (憑證信任清單 XML 架構定義

<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>