证书模板 Certificate templates 是 CA 证书颁发机构的一个组成部分,是证书策略中的重要元素,是用于证书注册、使用和管理的一组规则和格式。当 CA 收到对证书的请求时,必须对该请求应用一组规则和设置,以执行所请求的功能,例如证书颁发或更新。这些规则可以是简单的,也可以是复杂的,也可以适用于所有用户或特定的用户组。证书模板是在 CA 上配置并应用于传入证书请求的一组规则和设置。证书模板还向客户机提供了关于如何创建和提交有效的证书请求的说明。 基于证书模板的证书只能由企业 CA 颁发。这些模板存储在活动目录域服务(ADDS)中,以供林中的每个 CA 使用。这允许 CA 始终能够访问当前标准模板,并确保跨林一致的应用。
证书模板通过允许管理员发布已为选定任务预先配置的证书,可以大大简化管理证书颁发机构(CA)的任务。证书模板管理单元允许管理员执行以下任务:
- 查看每个证书模板的属性
- 复制和修改证书模板
- 控制哪些用户和计算机可以读取模板并注册证书
- 执行与证书模板相关的其他管理任务
证书模块的查看和修改
使用 certtmpl.msc 命令打开证书模板控制台,可以看到系统默认的证书模板
如果想查看或修改某个模板的属性,可以选中该模板,然后右键—>“属性 ®”进行查看。由于系统默认的模板绝大部分不可修改属性,因此使用这种方式查看的模板属性较少。我们可以通过复制模板操作来查看模板更多的属性,选中要查看属性的模板,右键—>“复制模板(U)”,会弹出新模板的属性配置窗口,在这个窗口可以查看模板全部的属性。如图所示,我们查看“域控制器身份验证”复制模板的属性。
如果想修改属性的值,可以直接修改,然后应用——>确定即可
不建议对系统默认的证书模板进行修改,如果想修改的话,建议先复制一个模板,然后再对其进行修改
复制证书模版
如果想要复制某个模板,可以选中该模板,然后右键——>复制模板(U)即可。
之后就可以在系统默认的末班中看到复制的模版了
证书模版的属性
使用者名称
使用者名称定义了如何构建证书的专有名称
- 在请求中提供
- 由来自请求证书的主体在活动目录中的信息来生成
如果是由来自请求证书的主体在活动目录中的信息来生成,其使用者名称的格式,有以下选项:
- DNS 名称
- 公用名
- 完全可分辨名称
- 无
是否将这个信息包括在另一个使用者名称中,这里有四个复选框
- 电子邮件名(E)
- DNS 名(D)
- 用户主体名称(UPN)(U)
- 服务的主体名称(SPN)(V)
发布要求
发布要求属性定义了要申请证书需要哪些条件
如图所示,可以看到并未勾选“CA 证书管理程序批准©”选项。那么有注册证书权限的用户即可申请证书。
如果勾选了“CA 证书管理程序批准©”选项,会在证书模板 AD 对象的 msPKI-Enrollment-Flag 属性上设置 CT_FLAG_PEND_ALL_REQUESTS (0x2) 位。
这会将基于该模板的所有证书注册请求置于待处理状态(Pending Requests,在 certsrv.msc 的 “挂起的申请” 部分中可见),这需要证书管理员在颁发证书之前予以批准或拒绝。
发布要求中显示的第二组限制是 “授权签名的数量(H)”和 “应用程序策略”。 前者要求证书请求在证书被颁发之前由现有的授权证书进行数字签名,该设置就定义了 CSR 中 CA 接受的签名数量。后者定义了颁发证书所需的签名证书必须具有的 EKU OID。这些设置的常见用途是注册代理(Enrollment Agents),其表示可以代表其他用户请求证书的实体。为此,CA 必须向注册代理帐户颁发至少包含证书请求代理 EKU(OID 1.3.6.1.4.1.311.20.2.1)的证书。一旦颁发,注册代理就可以代表其他用户签署 CSR 并请求证书。而前面所说的 “授权签名的数量(H)” 就指定了在 CA 考虑颁发证书之前,注册代理必须签署 CSR 的数量是多少。
取代模版
取代模板属性定义了此模板颁发的证书会取代该属性中所有添加到这个列表的模板所颁发的证书。
扩展
扩展属性定义了该模板中包含的扩展。需要注意的是应用程序策略扩展,这个扩展决定了这个模板的用途,比如说智能卡登录、服务器身份验证、客户端身份验证等等。经过测试,应用程序策略中包含如下用途的证书可用于 Kerberos 身份认证:
- 客户端身份验证,对应的 OID 为 1.3.6.1.5.5.7.3.2
- PKINIT 客户端身份验证,对应的 OID 为 1.3.6.1.5.2.3.4,默认情况下,没有该 OID,需要手动添加
- 智能卡登录,对应的 OID 为 1.3.6.1.4.1.311.20.2.2
- 任何目的,对应的 OID 为 2.5.29.37.0
- 子CA
此外,Specterops 发现可以滥用的另一个 EKU OID 是证书申请代理,对应 的 OID 为 1.3.6.1.4.1.311.20.2.1。除非设置了特定限制,否则具有此 OID 的证书可 用于代表其他用户申请证书
安全
安全属性也就是该证书模板的访问控制列表,定义了哪些对象对该模板有哪些权限,比如注册、读取、写入等权限。如图所示是域控制器身份验证模板的属性,可以看到普通用户只对其具有读取的属性。
常规
常规属性定义了证书的有效期和续订期
兼容性
兼容性属性定义了该模板兼容的证书颁发机构和证书接收人
请求处理
请求处理属性定义了证书的目的,以及该证书能否允许导出私钥等。
加密
加密属性定义了加密服务提供程序(CSP)和最小密钥大小。
用户模版
用户模板是默认的证书模板。如图所示,可以看到其扩展属性里有客户端身份验证,因此用户模板申请的证书可以用于 Kerberos 身份认证。
可以看到默认情况下 Domain Users 都有权限注册用户模板的证书。
使用 certipy 执行如下命令以普通用户 hack 权限申请注册一个用户模板的证书。
certipy req -u hack@tmac.com -p admin@123 -dc-ip 192.168.1.11 -target 192.168.1.12 -ca tmac-SERVER12-CA -template User -debug
certipy auth -pfx hack.pfx -dc-ip 192.168.1.11 -debug
计算机模版
计算机模板是默认的证书模板。如图所示,可以看到其扩展属性里有客户端身份验证,因此计算机模板申请的证书可以用于 Kerberos 身份认证。
可以看到默认情况下 Domain Computers 都有权限注册计算机模板的证书。
使用 certipy 执行如下命令以普通机器用户 machine$权限申请注册一个计算 机模板的证书。
certipy req -u machine\$ -p root -target 192.168.1.11 -ca tmac-SERVER12-CA -template Machine -debug
certipy auth -pfx machine.pfx -dc-ip 192.168.1.11 -debug