本文提供一种相对安全并且合规的根证书和信任链的建立流程。在开始之前,请准备一台air gap电脑(即和其它设备隔离,完全不连接到网络的电脑)和一个Windows Server 2016/2019安装U盘。
目标
- 创建一个安全的两级CA架构
- 正确public CRL(这是Hybrid AD join环境内Windows Hello for Business的基本要求)
计划
- 创建一台离线的Root CA机
- 创建一台在线的子CA机,用于AD内自动化签发证书
- 使用HTTP分发CRL
注意事项
Firefox 不支持 PKCS #1 v2.1 证书格式。如果你一定要让证书支持 Firefox,在下面把所有的 AlternateSignatureAlgorithm 设置成0。
流程
申请一个Private OID
如果你还没有OID,那么前往IANA PEN,填表,等一星期,会收到一个数字。比如这个数字是114514
,那么你的OID就是1.3.6.1.4.1.114514
。
Root CA
首先在离线的环境中安装一个Windows Server 2019。基础配置:
- 激活
- 修改主机名
然后我们要创建一个%SYSTEMROOT%\CAPolicy.inf
文件,必须使用ANSI编码。文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
[Version] Signature="$Windows NT$" [CRLDistributionPoint] URL=http://pki.example.com/cdp/RootCA.crl [AuthorityInformationAccess] URL=http://pki.example.com/Public/RootCA.crt [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 ForceUTF8=1 EnableKeyCounting=0 |
其中Policy相关的根据你自己的需要来确定数量和内容,一般不同安全等级的证书需要有不同的Policy。OID前半段是你申请到的OID,后半段可以自己随意填写。
创建完成后,去安装一个Active Directory Certificate Services的role(只需要Certification Authority这个role以及管理工具)。安装完成以后进入AD CS Configuration向导:
- Credentials里输入一个本地管理员的credential
- Role Services里面选择Certification Authority
- Setup Type选择Standalone CA
- CA Type选Root CA
- Private Key选择Create a new private key
- Cryptography这里随意,建议RSA4096+SHA512;如果不使用硬件安全模块的话,不需要勾选Allow administrator interaction这个选项
- CA Name这里,Common name填证书的显示名,别的都可以默认
- Validity Period,对于Root CA而言建议选20年以上
- Certificate Database可以默认
设置完成后点击开始创建证书即可。创建完成以后需要进行一些设置,打开certsrv.msc:
- 展开你的根证书-Revoked Certificates,右键属性,确认Publish Delta CRLs没有勾选
然后打开一个管理员权限的PowerShell,执行以下命令:
1 2 3 4 5 6 7 8 9 10 11 12 |
# 域名根据真实情况填写 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拷贝到服务器上,然后执行:
1 2 3 4 5 6 7 |
# 把证书写入 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
文件,内容要和之前的那些对应:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[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以及管理工具)。安装完以后配置向导:
- Credentials里输入一个Enterprise Admin账户组中账户的credential
- Role Services里面选择Certification Authority
- Setup Type选择Enterprise CA
- CA Type选Subordinate CA
- Private Key选择Create a new private key
- Cryptography这里随意,建议RSA4096+SHA512;如果不使用硬件安全模块的话,不需要勾选Allow administrator interaction这个选项
- CA Name这里,Common name填证书的显示名,别的默认
- Certificate Request里面选Save a certificate request to file on the target machine
- Validity Period,对于Root CA而言建议选20年以上
- Certificate Database可以默认
把刚刚生成的.req文件复制到Root CA那台服务器上,用本地管理员权限的账号登录,打开管理员权限的PowerShell,运行:
1 |
certreq -submit example.req |
在弹出的对话框中选择刚刚创建的Root CA,然后程序会返回一个RequestId数字(以2为例)。接着执行:
1 2 |
certutil -resubmit 2 certreq -retrieve 2 example.crt |
来完成证书的签发并取回证书。完事以后,把example.crt
复制到Enterprise Subordinate CA服务器上,导入:
1 2 |
certutil –installcert example.crt restart-service certsvc |
现在Root CA服务器可以关机了。同样我们需要设置一下Subordinate CA的CRL:
1 2 3 4 5 6 7 8 9 10 11 12 |
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:
1 2 3 4 |
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两个选项。
参考
Pingback引用通告: 设置Windows Autopilot和Hybrid AD Join | Drown in Codes
Pingback引用通告: 用Hashicorp Vault作为中级CA | Drown in Codes