엔터프라이즈 인증서 고정 개요

엔터프라이즈 인증서 고정은 루트 발급 인증 기관 또는 최종 엔터티 인증서를 도메인 이름으로 기억(고정)하기 위한 Windows 기능입니다.
이 기능은 내부 도메인 이름이 원치 않거나 부정하게 발급된 인증서에 연결되지 않도록 보호하여 중간에서 맨인 더 중간 공격을 줄이는 데 도움이 됩니다.

참고

공공 인증 기관이 인증서를 발급하는 외부 도메인 이름은 엔터프라이즈 인증서 고정 기능을 사용하기에 적합하지 않습니다.

서버를 인증하는 사이트 체인이 제한된 인증서 집합과 일치하는 경우 Windows 인증서 API(CertVerifyCertificateChainPolicyWinVerifyTrust)가 검사 업데이트됩니다.
제한 사항은 구성되고 Windows 디바이스에 배포되는 CTL(Pin 규칙 인증서 신뢰 목록) 에 캡슐화됩니다.
이름 불일치를 트리거하는 사이트 인증서는 Windows에서 CAPI2 이벤트 로그에 이벤트를 작성하게 하고 사용자가 웹 사이트를 검색하지 못하게 합니다.

참고

엔터프라이즈 인증서 고정 기능 트리거는 Microsoft Edge 이외의 클라이언트가 연결을 차단하지 않습니다.

배포

엔터프라이즈 인증서 고정 기능을 배포하려면 다음을 수행해야 합니다.

  • 올바른 형식의 인증서 고정 규칙 XML 파일 만들기
  • XML 파일을 사용하여 고정 규칙 인증서 신뢰 목록 파일 만들기
  • 고정 규칙 인증서 신뢰 목록 파일을 참조 관리 컴퓨터에 적용
  • 그룹 정책을 통해 참조 컴퓨터에 레지스트리 구성 배포

핀 규칙 XML 파일 만들기

XML 기반 고정 규칙 파일은 PinRule 요소 시퀀스로 구성됩니다. 각 PinRule 요소에는 하나 이상의 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 데이터 형식으로 나타냅니다.
필수 여부 예. 하나 이상 필요합니다.
LogDuration 또는 LogEndDate 고정 규칙 적용 만료 기간을 초과하여 연장하도록 감사를 구성합니다.
LogEndDate는 UTC의 XML DateTime 데이터 형식으로 표시하며 둘 다 지정된 경우 우선합니다.
LogDuration을 년 및 월을 허용하지 않는 XML TimeSpan 데이터 형식으로 나타냅니다.
'특성이 지정되지 않은 경우 감사 만료는 Duration 또는 NextUpdate 특성을 사용합니다.
아니요.
ListIdentifier 고정 규칙 목록의 이름을 제공합니다. Windows는 인증서 고정 적용에 이 특성을 사용하지 않습니다. 그러나 핀 규칙이 CTL(인증서 신뢰 목록)으로 변환되는 경우 포함됩니다. 아니요.

PinRule 요소

PinRule 요소는 다음과 같은 특성을 가질 수 있습니다.

특성 설명 필수
Name PinRule을 고유하게 식별합니다. Windows는 특성을 사용하여 구문 분석 오류 또는 자세한 출력에 대한 요소를 식별합니다. 특성은 생성된 CTL(인증서 신뢰 목록)에 포함되지 않습니다. 예.
Error PIN 불일치가 발생할 때 수행되는 작업을 설명합니다. 다음과 같은 문자열 값에서 선택할 수 있습니다.
- Revoked - Windows는 인증서가 해지된 것처럼 사이트를 보호하는 인증서를 보고합니다. 일반적으로 사용자가 사이트에 액세스하지 못하게 합니다.
- InvalidName - Windows는 인증서의 이름이 사이트 이름과 일치하지 않는 것처럼 사이트를 보호하는 인증서를 보고합니다. 일반적으로 사이트에 액세스하기 전에 사용자에게 메시지를 표시합니다.
- None - 기본값입니다. 오류가 반환되지 않습니다. 설정을 사용하여 사용자 마찰을 발생하지 않고 핀 규칙을 감사할 수 있습니다.
아니요.
Log 부울 값은 true 또는 false와 같은 문자열을 나타냅니다. 기본적으로 로깅이 사용됩니다(true). 아니요.

Certificate 요소

Certificate 요소는 다음과 같은 특성을 가질 수 있습니다.

특성 설명 필수
File 하나 이상의 인증서가 포함된 파일의 경로입니다. 인증서는 다음과 같이 인코딩될 수 있습니다.
- single certificate
- p7b
- sst
이러한 파일은 Base64로 형식이 지정될 수도 있습니다. 동일한 PinRule에 포함된 모든 Site 요소는 이러한 인증서 중 하나와 일치할 수 있습니다.
예(파일, 디렉터리 또는 Base64가 있어야 합니다).
Directory 위의 인증서 파일 중 하나 이상이 포함된 디렉터리 경로입니다. 인증서가 없는 파일은 건너뜁니다. 예(파일, 디렉터리 또는 Base64가 있어야 합니다).
Base64 Base64로 인코딩된 인증서입니다. 인증서는 다음과 같이 인코딩될 수 있습니다.
- single certificate
- p7b
- sst
이를 통해 파일 디렉터리 종속성 없이 XML 파일에 인증서를 포함할 수 있습니다.
참고:
certutil -encode를 사용하여 .cer 파일을 base64로 변환할 수 있습니다. 그런 다음 메모장을 사용하여 base64로 인코딩된 인증서를 복사해서 고정 규칙에 붙여 넣을 수 있습니다.
예(파일, 디렉터리 또는 Base64가 있어야 합니다).
EndDate 인증서가 고정 규칙에서 더 이상 유효하지 않은 경우 만료 날짜를 구성할 수 있습니다.
새 루트 또는 CA로 전환하는 중이라면 EndDate 를 설정하여 이 요소의 인증서를 일치시킬 수 있습니다.
현재 시간이 EndDate를 지난 경우 CTL(인증서 신뢰 목록)을 만들 때 파서는 경고 메시지를 출력하고 생성된 CTL의 고정 규칙에서 인증서를 제외합니다.
고정 규칙 서식 지정에 대한 도움말은 XML에서 날짜 표시를 참조하세요.
아니요.

Site 요소

Site 요소는 다음과 같은 특성을 가질 수 있습니다.

특성 설명 필수
Domain 이 고정 규칙에 대해 일치시킬 DNS 이름을 포함합니다. 인증서 신뢰 목록을 만들 때 파서는 다음과 같이 입력 이름 문자열 값을 정규화합니다.
- DNS 이름에 선행 "*"이 있으면 제거됩니다.
- 비 ASCII DNS 이름이 ASCII Puny Code로 변환됩니다.
- 대문자 ASCII 문자는 소문자로 변환됩니다.
정규화된 이름에 선행 "."이 있는 경우 와일드카드 왼쪽 레이블 일치가 사용됩니다. 예를 들어 ".xyz.com"은 "abc.xyz.com"과 일치합니다.
AllSubdomains 기본적으로 와일드카드 왼쪽 레이블 일치는 단일 왼쪽 레이블로 제한됩니다. 이 특성을 "true"로 설정하면 모든 왼쪽 레이블의 와일드카드 일치를 사용할 수 있습니다.
예를 들어 이 특성을 설정하면 "123.abc.xyz.com"이 ".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은 이를 결과 핀 규칙 인증서 신뢰 목록에서 병합합니다.
  • Certutil.exe XML 스키마 정의를 엄격하게 적용하지 않습니다.

Certutil은 다음을 수행하여 다른 도구가 고유한 특정 요소 및 특성을 추가/사용할 수 있도록 합니다.

  • PinRules 요소 앞과 뒤의 요소를 건너뜁니다.
  • PinRules 요소 내에서 인증서 또는 사이트와 일치하지 않는 요소를 건너뜁니다.
  • 각 요소 형식에 대해 위의 이름과 일치하지 않는 특성을 건너뜁니다.

인증서 고정 규칙이 있는 XML 파일에 대해 certutil 명령을 generatePinRulesCTL 인수와 함께 사용합니다. 마지막으로, 인증서 신뢰 목록의 형식으로 인증서 고정 규칙을 포함할 출력 파일의 이름을 제공합니다.

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. 그룹 정책 관리 편집기의 탐색 창에서 컴퓨터 구성 아래 기본 설정 노드를 확장합니다. Windows 설정 확장
  8. 레지스트리 노드를 마우스 오른쪽 단추로 클릭하고 새로 만들기를 선택합니다.
  9. 새 레지스트리 속성 대화 상자의 동작 목록에서 업데이트를 선택합니다. Hive 목록에서 HKEY_LOCAL_MACHINE 선택
  10. 키 경로대해 ...를 선택하여 레지스트리 항목 브라우저를 시작합니다. 다음 레지스트리 키로 이동하여 PinRules 레지스트리 값 이름을 선택합니다.

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

선택을 선택하여레지스트리 항목 브라우저를 닫습니다.

  1. 키 경로에 선택한 레지스트리 키가 있어야 합니다. 값 이름 구성에는 레지스트리 값 이름 PinRules가 포함되어야 합니다. 값 형식REG_BINARY 읽어야 하며 값 데이터에 는 0-9의 긴 숫자와 A-F(16진수)의 문자가 포함되어야 합니다. 확인을 선택하여 설정을 저장하고 대화 상자를 닫습니다.

PinRules 속성입니다.

  1. 그룹 정책 관리 편집기 닫아 설정을 저장합니다.
  2. 구성하려는 디바이스가 포함된 OU에 엔터프라이즈 인증서 고정 규칙 GPO 연결

추가 핀 규칙 로깅

인증서 고정 규칙을 생성하는 데 도움이 되도록 인증서 체인 구성 레지스트리 키 아래에 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 파일을 세 개의 자식 폴더 중 하나에 씁니다.

  • 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을 사용하여 이러한 날짜의 형식을 지정할 수 있습니다.
그런 다음 cmdlet의 출력을 복사하여 XML 파일에 붙여 넣을 수 있습니다.

날짜를 나타냅니다.

편의를 위해 소수점(.)과 그 뒤의 숫자를 자를 수 있습니다. 그러나 XML 날짜 문자열의 끝에 대문자 "Z"를 추가해야 합니다.

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

XML 날짜 변환

Windows PowerShell 사용하여 XML 날짜의 유효성을 검사하고 사람이 읽을 수 있는 날짜로 변환하여 올바른 날짜인지 확인할 수도 있습니다.

XML 날짜 변환

XML의 기간을 나타냅니다.

일부 요소는 날짜가 아닌 기간을 사용하도록 구성될 수 있습니다. 기간을 XML timespan 데이터 형식으로 표시해야 합니다. Windows PowerShell을 사용하여 기간(시간 간격)의 형식을 적절히 지정하고 유효성을 검사한 다음 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>