本文解决了当子域中的用户作为证书颁发机构(CA)请求证书时,颁发的证书不会在 Active Directory 中发布的问题。
适用于: 所有受支持的 Windows Server 版本原始 KB 数: 281271
现象
在以下方案中,如果与 CA 相同的域中的用户请求证书,则颁发的证书将发布到 Active Directory 中。 如果用户来自子域,则此过程不会成功。 此外,当与 CA 请求证书相同的域的用户时,颁发的证书可能不会在 Active Directory 中发布。
方案 1
在这种情况下,如果满足以下条件,CA 不会将颁发的证书发布到子域中用户的 DS 对象:
- 用户位于具有父域和子域的两级域层次结构中。
- 企业 CA 位于父域上,用户位于子域中。
- 子域中的用户在父 CA 中注册。
在具有父域和子域的两级域层次结构中,企业 CA 位于父域中。 用户位于子域中。 子域中的用户注册父 CA,CA 会将颁发的证书发布到子域中用户的 DS 对象。
此外,以下事件在 CA 服务器上记录:
日志名称: 应用程序 来源:Microsoft-Windows-CertificationAuthority 事件 ID:80 任务类别:无 级别: 警告 关键字: 用户: 系统 计算机:CA.CONTOSO.COM 说明: Active Directory 证书服务无法将请求 XXX 的证书发布到服务器 DC.CHILD.CONTOSO.COM 上的以下位置:CN=CHILDSRV、CN=Computers、DC=CHILD、DC=CONTOSO、DC=COM。 访问权限不足,无法执行操作。 0x80072098(WIN32:8344 ERROR_DS_INSUFF_ACCESS_RIGHTS)。 ldap: 0x32: 00002098: SecErr: DSID-XXXXXXXX, 问题 4003 (INSUFF_ACCESS_RIGHTS), 数据 0
方案 2
假设出现了下面这种情景:
- 用户位于单级域或父域中。
- 企业 CA 位于父域。
- 域控制器未安装修补程序 327825 。
- 在单级或父域中,用户注册单级证书颁发机构或父证书颁发机构。
在此方案中,证书颁发机构不会将颁发的证书发布到单级域或父域中用户域服务器对象。
原因
-
对于 方案 1:两级域层次结构
子域中的用户没有注册的适当权限。 即使这样做,CA 也没有将证书发布到 Active Directory 的访问权限。
默认情况下,只有来自 CA 的域用户具有注册权限。
默认情况下,CA 在其域中向用户授予以下必要权限:
-
读取
userCertificate。 -
写入
userCertificate。父域中的 CA 无权访问
userCertificate子域中用户的属性。
-
-
对于 方案 2:单级域或父域
默认情况下,在 Windows 中,AdminSDHolder 对象不会向 Cert Publishers 组授予 AdminSDHolder 进程中涵盖的用户帐户所需的权限。 以下列表包含 Windows 中受保护的用户帐户组:
-
Enterprise Admins
-
Schema Admins
-
Domain Admins
-
管理员
应用修补程序 KB327825后,Windows 中的以下用户帐户组列表现在受保护的用户帐户组:
-
管理员
-
Account Operators
-
Server Operators
-
打印操作员
-
备份操作员
-
Domain Admins
-
Schema Admins
-
企业管理员
-
Cert Publishers
-
解决方法
根据方案尝试以下解决方法。
对于 方案 1:两级域层次结构
若要使子域用户能够获取证书并将其发布到 Active Directory,请执行以下步骤:
- 设置 CA 模板的权限以允许注册请求。 设置用户对象权限以允许 CA 发布证书。 更改 AdminSDHolder,将用户对象权限推送到管理员用户。
- 设置用户对象权限以允许 CA 发布证书。 更改 AdminSDHolder,将用户对象权限推送到管理员用户。
- 更改 AdminSDHolder,将用户对象权限推送到管理员用户。
注意
必须先从 Windows Professional 或 Windows Server CD-ROM 安装支持工具。
使子域用户能够获取证书并将其发布到 Active Directory
-
设置对 CA 的权限,以允许用户在子域中请求证书。 默认情况下,它应已到位。
- 打开证书颁发机构管理单元,右键单击 CA,然后选择“ 属性”。
- 在 “安全 ”选项卡上,确保允许经过身份验证的用户组请求证书。
-
设置对适用证书模板的权限,以允许用户在子域中注册。
注意
必须使用域管理员权限登录到根域。
- 打开 Active Directory 站点和服务管理单元。
- 选择“视图”,然后选择“显示服务节点”。
- 展开“服务节点”文件夹,展开公钥服务,然后选择“证书模板”。
- 在 “详细信息 ”窗格中,选择所需的模板或模板。 例如,右键单击 用户证书 模板,然后选择“ 属性”。
- 在 “安全 ”选项卡上,向所需组授予注册权限,例如“经过身份验证的用户”。
-
将 CA 退出模块配置为将证书发布到 Active Directory。
- 在证书颁发机构管理单元中,右键单击 CA,然后选择“ 属性”。
- 在 “退出模块 ”选项卡上,选择“ 配置”。
- 在退出模块的属性中,选择 “允许证书在 Active Directory ”框中发布。
在子域控制器上:
注意
在 Windows Server 域中,Cert Publishers 组是域全局组。 必须将证书发布者组手动添加到每个子域。
可以让子域用户获取证书并在 Windows Server 域中发布证书。 为此,请将组类型更改为 “本地域”,并包括父域中的 CA 服务器。 此过程将创建新安装的 Windows Server 域中存在的相同配置。 用户界面(UI)不允许更改组类型。 但是,可以使用
dsmod此命令将证书发布服务器组从域全局组更改为域本地组:dsmod group Group Distinguished Name -scope l在某些情况下,无法将 groupType 直接从全局更改为域本地组。 在这种情况下,必须将全局组更改为通用组,并将通用组更改为域本地组。 为此,请按照以下步骤操作:
-
键入以下命令,然后按 Enter:
dsmod group Group Distinguished Name -scope u此命令将全局组更改为通用组。
-
键入以下命令,然后按 Enter:
dsmod group Group Distinguished Name -scope l此命令将通用组更改为域本地组。
对于 方案 2:单级域或父域
在单级域控制器或父域控制器上,运行以下命令,保留引号:
dsacls "cn=adminsdholder,cn=system, dc=<your domain>,dc=<com>" /G "<CA's domain> \Cert Publishers:WP;userCertificate"
dsacls "cn=adminsdholder,cn=system, dc=<your domain>,dc=<com>" /G "<CA's domain> \Cert Publishers:RP;userCertificate"
其中 dc=<your domain,dc>=<com> 是子域的可分辨名称(DN)。 CA <的域> 是 CA 所在的域名。
Status
Microsoft已确认 Windows Server 中存在问题。
详细信息
当子域中的用户无法成功注册时,CA 应用程序事件日志中会生成以下错误:
事件类型: 警告 事件源:CertSvc 事件类别: 无 事件 ID:53 日期:2000/08/14 时间:05:13:00 用户:无 计算机: <根 CA 名称> 说明: 证书服务拒绝请求 <#> ,因为访问被拒绝。 0x80070005 (WIN32: 5)。 请求适用于(未知主题)。 其他信息:策略模块拒绝
如果设置了 ACL 以便用户可以注册,但 CA 无权发布到用户的 Active Directory,则会在 CA 应用程序事件日志中生成以下错误:
事件类型:错误 事件源:CertSvc 事件类别: 无 事件 ID:46 日期:2000/08/14 时间:05:13:00 用户:无 计算机: <根 CA 名称> 说明: “企业和独立退出模块”退出模块“Notify”方法返回错误。 拒绝访问。 返回的状态代码0x80070005(5)。 证书颁发机构无法将 Child\User 的证书发布到目录服务。 拒绝访问。 (0x80070005)