Active Directory Certificate Services基础设定

本文提供一种相对安全并且合规的根证书和信任链的建立流程。在开始之前,请准备一台air gap电脑(即和其它设备隔离,完全不连接到网络的电脑)和一个Windows Server 2016/2019安装U盘。

目标

  • 创建一个安全的两级CA架构
  • 正确public CRL(这是Hybrid AD join环境内Windows Hello for Business的基本要求)

计划

  • 创建一台离线的Root CA机
  • 创建一台在线的子CA机,用于AD内自动化签发证书
  • 使用HTTP分发CRL

流程

申请一个Private OID

如果你还没有OID,那么前往IANA PEN,填表,等一星期,会收到一个数字。比如这个数字是114514,那么你的OID就是1.3.6.1.4.1.114514

Root CA

首先在离线的环境中安装一个Windows Server 2019。基础配置:

  • 激活
  • 修改主机名

然后我们要创建一个C:\Windows\CAPolicy.inf文件,必须使用ANSI编码。文件内容如下:

[Version]  
Signature="$Windows NT$"

[PolicyStatementExtension]  
Policies=StrictPolicy,ActiveDirectoryPolicy,LoosePolicy

[StrictPolicy]
OID = 1.3.6.1.4.1.114514.5.1.1
NOTICE="This Certification Authority is an internal resource. Certificates issued by this CA are for internal use only."
URL="https://example.com/cps"

[ActiveDirectoryPolicy]  
OID= 1.3.6.1.4.1.114514.5.1.2
NOTICE="This Certification Authority is an internal resource. Certificates issued by this CA are for internal use only."
URL="https://example.com/cps"

[LoosePolicy]  
OID= 1.3.6.1.4.1.114514.5.1.3
NOTICE="This Certification Authority is an internal resource. Certificates issued by this CA are for internal use only."
URL="https://example.com/cps"

[Certsrv_Server]  
RenewalKeyLength=4096
RenewalValidityPeriod=Years
RenewalValidityPeriodUnits=20
CRLPeriod=weeks
CRLPeriodUnits=26
CRLDeltaPeriod=Days
CRLDeltaPeriodUnits=0 ;disables Delta CRL publishing
LoadDefaultTemplates=0
AlternateSignatureAlgorithm=1

其中Policy相关的根据你自己的需要来确定数量和内容,一般不同安全等级的证书需要有不同的Policy。OID前半段是你申请到的OID,后半段可以自己随意填写。

创建完成后,去安装一个Active Directory Certificate Services的role(只需要Certification Authority这个role以及管理工具)。安装完成以后进入AD CS Configuration向导:

  1. Credentials里输入一个本地管理员的credential
  2. Role Services里面选择Certification Authority
  3. Setup Type选择Standalone CA
  4. CA Type选Root CA
  5. Private Key选择Create a new private key
  6. Cryptography这里随意,建议RSA4096+SHA512;如果不使用硬件安全模块的话,不需要勾选Allow administrator interaction这个选项
  7. CA Name这里,Common name填证书的显示名,别的都可以默认
  8. Validity Period,对于Root CA而言建议选20年以上
  9. Certificate Database可以默认

设置完成后点击开始创建证书即可。创建完成以后需要进行一些设置,打开certsrv.msc:

  1. 展开你的根证书-Revoked Certificates,右键属性,确认Publish Delta CRLs没有勾选

然后打开一个管理员权限的PowerShell,执行以下命令:

# 域名根据真实情况填写
certutil -setreg CA\CRLPublicationURLs "1:C:\Windows\system32\CertSrv\CertEnroll\%3%8.crl\n2:http://pki.example.com/%3%8.crl"
# 域名根据真实情况填写
certutil –setreg CA\CACertPublicationURLs "2:http://pki.example.com/%1_%3%4.crt"
Certutil -setreg CA\CRLOverlapPeriodUnits 24
Certutil -setreg CA\CRLOverlapPeriod "Hours"
Certutil -setreg CA\ValidityPeriodUnits 10
Certutil -setreg CA\ValidityPeriod "Years"
# CN 根据你的域真实情况填写
certutil -setreg CA\DSConfigDN CN=Configuration,DC=corp,DC=contoso,DC=com
restart-service certsvc
certutil -crl

打开C:\Windows\system32\certsrv\certenroll\,把里面的证书和CRL文件复制出来。

Enterprise Subordinate CA

这个CA需要安装在域里一台可信的Windows Server上。使用同时为Domain Admin和Enterprise Admin组的用户登录到这台服务器,把证书和CRL拷贝到服务器上,然后执行:

# 把证书写入 AD DS 以使加域的设备自动获得根证书
certutil –dspublish –f orca1_ContosoRootCA.crt RootCA
# 把证书和 CRL 写入本机,这样就不用等待 AD DS 同步
certutil –addstore –f root orca1_ContosoRootCA.crt
certutil –addstore –f root ContosoRootCA.crl
# 同步组策略,确保证书已被信任
gpupdate /force

然后同样创建一个C:\Windows\CAPolicy.inf文件,内容要和之前的那些对应:

[Version]
Signature="$Windows NT$"

[PolicyStatementExtension]  
Policies=ActiveDirectoryPolicy

[ActiveDirectoryPolicy]
OID= 1.3.6.1.4.1.114514.5.1.2
NOTICE="This Certification Authority is an internal resource. Certificates issued by this CA are for internal use only."
URL="https://example.com/cps"

[Certsrv_Server]
RenewalKeyLength=4096
RenewalValidityPeriod=Years
RenewalValidityPeriodUnits=5
LoadDefaultTemplates=0
AlternateSignatureAlgorithm=1

完成以后同样安装一个Active Directory Certificate Services的role(只需要Certification Authority这个role以及管理工具)。安装完以后配置向导:

  1. Credentials里输入一个Enterprise Admin账户组中账户的credential
  2. Role Services里面选择Certification Authority
  3. Setup Type选择Enterprise CA
  4. CA Type选Subordinate CA
  5. Private Key选择Create a new private key
  6. Cryptography这里随意,建议RSA4096+SHA512;如果不使用硬件安全模块的话,不需要勾选Allow administrator interaction这个选项
  7. CA Name这里,Common name填证书的显示名,别的默认
  8. Certificate Request里面选Save a certificate request to file on the target machine
  9. Validity Period,对于Root CA而言建议选20年以上
  10. Certificate Database可以默认

把刚刚生成的.req文件复制到Root CA那台服务器上,用本地管理员权限的账号登录,打开管理员权限的PowerShell,运行:

certreq -submit example.req

在弹出的对话框中选择刚刚创建的Root CA,然后程序会返回一个RequestId数字(以2为例)。接着执行:

certutil -resubmit 2
certreq -retrieve 2 example.crt

来完成证书的签发并取回证书。完事以后,把example.crt复制到Enterprise Subordinate CA服务器上,导入:

certutil –installcert example.crt
restart-service certsvc

现在Root CA服务器可以关机了。同样我们需要设置一下Subordinate CA的CRL:

certutil -setreg CA\CRLPublicationURLs "1:C:\Windows\system32\CertSrv\CertEnroll\%3%8.crl\n2:http://pki.example.com/%3%8.crl"
certutil -setreg CA\CACertPublicationURLs "2:http://pki.example.com/%1_%3%4.crt\n1:file://\\subca.corp.example.com\pki\%1_%3%4.crt"
Certutil -setreg CA\CRLPeriodUnits 2
Certutil -setreg CA\CRLPeriod "Weeks"
Certutil -setreg CA\CRLDeltaPeriodUnits 1
Certutil -setreg CA\CRLDeltaPeriod "Days"
Certutil -setreg CA\CRLOverlapPeriodUnits 96
Certutil -setreg CA\CRLOverlapPeriod "Hours"
Certutil -setreg CA\ValidityPeriodUnits 5
Certutil -setreg CA\ValidityPeriod "Years"
restart-service certsvc
certutil -crl

分发CRL

创建一个SMB共享文件夹用来分发CRL:

New-item -path c:\pki –type directory
new-smbshare -name pki c:\pki -FullAccess SYSTEM,"CORP\Domain Admins" -ChangeAccess "CORP\Cert Publishers"
copy rootca*.cr* c:\pki\
copy c:\Windows\system32\certsrv\certenroll\*.cr* c:\pki\

对于HTTP分发方式,需要自行设置。

Auto Enrollment

组策略中,Computer Configuration -> Policie -> Windows Settings -> Security Settings -> Public Key Policies -> Certificate Services Client – Auto-Enrollment,启用并勾选Renew和Update两个选项。


参考

Active Directory Certificate Services基础设定》有2个想法

  1. Pingback引用通告: 设置Windows Autopilot和Hybrid AD Join | Drown in Codes

  2. Pingback引用通告: 用Hashicorp Vault作为中级CA | Drown in Codes

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据