证书服务无法将一个 CA 证书添加到 Active Directory 中
Active Directory 证书服务 (AD CS) 要求对 Active Directory 域服务 (AD DS) 中的某些对象具有读取访问权限,在某些情况下还要求具有写入权限。如果无法访问这些 Active Directory 对象,则可能会妨碍 AD CS 启动。
启用 AD CS 以将 CA 证书添加到 Active Directory 域服务
要启用 Active Directory 证书服务 (AD CS) 以将事件日志消息中标识的证书颁发机构 (CA) 证书添加到 Active Directory 域服务 (AD DS),请执行以下操作:
确认 CA 具有基本 AD DS 容器和对象的权限。
请确定 AIA 容器中是否存在 CA 证书。
如果不存在,请将 CA 证书手动发布到 AIA 容器。
要执行此过程,必须拥有管理员成员身份,或者已向你委派了适当的权限。
确认基本 AD DS 容器和对象的权限
要确认 CA 具有 AD DS 容器及这些容器内对象的所需权限,请执行以下操作:
在域控制器上,单击“开始”,指向“管理工具”,然后单击“Active Directory 站点和服务”。
单击“Active Directory 站点和服务 [域名]”,其中 [域名] 是您的域的名称。
在“查看”菜单中,单击“显示服务节点”。
双击 Services,再双击 Public Key Services,然后右键单击下面列出的每个容器或容器内列出的对象,然后单击“属性”。
在“安全”选项卡中,确认所需的权限。
以下是托管 CA 的计算机需要的所有 Active Directory 权限。某些权限是通过证书发行者组中的成员存档的。
注册服务容器。CA 计算机对其自己的对象具有读写访问权限。
AIA 容器。证书发行者组对 AIA 容器具有完全控制访问权限,CA 计算机对其在 AIA 容器内的对象具有完全控制访问权限。
CDP 容器。证书发行者组对 CDP 容器下的每个 CA 容器具有完全控制访问权限,CA 计算机对其容器内的每个证书吊销列表 (CRL) 对象具有完全控制访问权限。
证书颁发机构容器。证书发行者组对此容器内的对象具有完全控制访问权限。
证书模板容器。企业管理员和域管理员组(非 CA 计算机)对此容器及其内部大多数对象具有完全控制权限或读写访问权限。
KRA 容器。CA 计算机对其自己的对象具有完全控制访问权限。
OID 容器。企业管理员和域管理员组(非 CA 计算机)对此容器及其内部容器和对象具有完全控制权限或读写访问权限。
NTAuthCertificates 对象。企业管理员和域管理员组(非 CA 计算机)具有完全控制权限或读写访问权限。
域计算机和域用户容器。证书发行者组对部署了 AD CS 的林中的每个用户和计算机对象的 userCertificate 属性具有读写访问权限。
要执行这些过程,您必须拥有管理 CA 权限,或者您必须被委派了适当的权限。
请确定 AIA 容器中是否存在 CA 证书
要查看 AD DS 的 AIA 容器中的内容,请执行以下操作:
在域控制器上,单击“开始”,键入 cmd,然后按 ENTER。
键入 certutil -cainfo,然后按 ENTER。
在命令输出中,请注意在净化的短名称之后列出的属性。
键入以下命令,然后按 Enter 键:
certutil -viewstore ldap:///CN=<MyCA>,CN=AIA,CN=Public Key Services,CN=Services,CN=Configuration,DC=<contoso>,DC=<com>?cACertificate?base?objectclass=certificationAuthority
将 MyCA 替换为先前命令中的 Sanitized Short Name 属性,并将 contoso 和 com 替换为 Active Directory 根域的轻型目录访问协议 (LDAP) 可分辨名称。
如果 CA 证书没有出现在 AIA 容器中并且您具有所需的权限,请使用以下操作发布 CA 证书。
手动发布 CA 证书
要将 CA 证书手动发布到 AD DS,请执行以下操作:
在 CA 上,单击“开始”,键入 cmd,然后按 ENTER。
对于根 CA 证书,键入以下命令,然后按 ENTER:certutil [-f] -dspublish <CAcert.cer> RootCA
对于子级 CA 证书,键入以下命令,然后按 ENTER: certutil [-f] -dspublish <CAcert.cer> SubCA
将 <CAcert.cer> 替换为证书文件的名称。“-f”标志可重新创建对象,即使其已被删除也是如此。
要检查 CA 和 Active Directory 域服务 (AD DS) 之间的连接,请执行以下操作:
在托管 CA 的计算机上打开命令提示符窗口。
键入 nltest /sc_verify:[Domainname] 然后按 Enter。
使用以下步骤确认基本 AD DS 容器和对象的权限。
使用安装了 CA 的命名空间的名称替换 [域名]。
确认基本 AD DS 容器和对象的权限
要执行此过程,必须拥有管理员成员身份,或者已向你委派了适当的权限。
要确认 CA 具有 AD DS 容器以及这些容器内对象的所需权限,请执行以下操作:
在域控制器上,单击“开始”,指向“管理工具”,然后单击“Active Directory 站点和服务”。
单击“Active Directory 站点和服务 [域名]”,其中 [域名] 是您的域的名称。
在“查看”菜单中,单击“显示服务节点”。
双击 Services,再双击 Public Key Services,然后右键单击下面列出的每个容器或容器内列出的对象,然后单击“属性”。
在“安全”选项卡中,确认所需的权限。
以下是托管 CA 的计算机需要的所有 Active Directory 权限。某些权限是通过证书发行者组中的成员存档的。
注册服务容器。CA 计算机对其自己的对象具有读写访问权限。
AIA 容器。证书发行者组对 AIA 容器具有完全控制访问权限,CA 计算机对其在 AIA 容器内的对象具有完全控制访问权限。
CDP 容器。证书发行者组对 CDP 容器下的每个 CA 容器具有完全控制访问权限,CA 计算机对其容器内的每个证书吊销列表 (CRL) 对象具有完全控制访问权限。
证书颁发机构容器。证书发行者组对此容器内的对象具有完全控制访问权限。
证书模板容器。企业管理员和域管理员组(非 CA 计算机)对此容器及其内部大多数对象具有完全控制权限或读写访问权限。
KRA 容器。CA 计算机对其自己的对象具有完全控制访问权限。
OID 容器。企业管理员和域管理员组(非 CA 计算机)对此容器及其内部容器和对象具有完全控制权限或读写访问权限。
NTAuthCertificates 对象。企业管理员和域管理员组(非 CA 计算机)具有完全控制权限或读写访问权限。
域计算机和域用户容器。证书发行者组对部署了 AD CS 的林中的每个用户和计算机对象的 userCertificate 属性具有读写访问权限。
Target | Microsoft.Windows.CertificateServices.CARole.2016 | ||
Category | EventCollection | ||
Enabled | True | ||
Event_ID | 106 | ||
Event Source | Microsoft-Windows-CertificationAuthority | ||
Alert Generate | True | ||
Alert Severity | Error | ||
Alert Priority | High | ||
Remotable | True | ||
Alert Message |
| ||
Event Log | Application |
ID | Module Type | TypeId | RunAs |
---|---|---|---|
DS | DataSource | Microsoft.Windows.EventProvider | Default |
Alert | WriteAction | System.Health.GenerateAlert | Default |
WriteToCertSvcEvents | WriteAction | Microsoft.Windows.CertificateServices.CARole.CertSvcEvents.Publisher | Default |
WriteToDB | WriteAction | Microsoft.SystemCenter.CollectEvent | Default |
<Rule ID="Microsoft.Windows.CertificateServices.CARole.2016.CertSvcEvents.106" Enabled="true" Target="CSDisc!Microsoft.Windows.CertificateServices.CARole.2016" ConfirmDelivery="true" Remotable="true" Priority="Normal" DiscardLevel="100">
<Category>EventCollection</Category>
<DataSources>
<DataSource ID="DS" TypeID="Windows!Microsoft.Windows.EventProvider">
<ComputerName>$Target/Host/Property[Type="Windows!Microsoft.Windows.Computer"]/NetworkName$</ComputerName>
<LogName>Application</LogName>
<Expression>
<And>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="UnsignedInteger">EventDisplayNumber</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="UnsignedInteger">106</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
<Expression>
<SimpleExpression>
<ValueExpression>
<XPathQuery Type="String">PublisherName</XPathQuery>
</ValueExpression>
<Operator>Equal</Operator>
<ValueExpression>
<Value Type="String">Microsoft-Windows-CertificationAuthority</Value>
</ValueExpression>
</SimpleExpression>
</Expression>
</And>
</Expression>
</DataSource>
</DataSources>
<WriteActions>
<WriteAction ID="WriteToDB" TypeID="SC!Microsoft.SystemCenter.CollectEvent"/>
<WriteAction ID="WriteToCertSvcEvents" TypeID="Microsoft.Windows.CertificateServices.CARole.CertSvcEvents.Publisher"/>
<WriteAction ID="Alert" TypeID="Health!System.Health.GenerateAlert">
<Priority>2</Priority>
<Severity>2</Severity>
<AlertMessageId>$MPElement[Name="AlertMessageID4f12f8d124ed4ece99544c9a9730fa37"]$</AlertMessageId>
<AlertParameters>
<AlertParameter1>$Data/EventDescription$</AlertParameter1>
</AlertParameters>
<Suppression>
<SuppressionValue>$Data/EventDisplayNumber$</SuppressionValue>
<SuppressionValue>$Data/PublisherName$</SuppressionValue>
<SuppressionValue>$Data/LoggingComputer$</SuppressionValue>
</Suppression>
</WriteAction>
</WriteActions>
</Rule>