高级证书注册和管理

发布日期: 2004年11月18日

复杂的基础结构环境和分公司部署环境通常需要使用独特的高级管理技术来管理公钥基础结构 (PKI) 或远程服务器的证书部署。本白皮书阐述了为实现一个安全的基础结构而执行 X.509 证书注册的循序渐进操作步骤,同时还附带介绍了几种远程部署方案。

本页内容
简介简介
申请脱机域控制器证书申请脱机域控制器证书
处理域控制器证书处理域控制器证书
域控制器证书安装域控制器证书安装
移除域控制器证书移除域控制器证书
疑难解答疑难解答
附录 1:识别域控制器 GUID附录 1:识别域控制器 GUID
附录 2:示例脚本附录 2:示例脚本
附录 3:Certreq.exe 语法附录 3:Certreq.exe 语法
附录 4:Certutil -setextension附录 4:Certutil -setextension
附录 5:ASN.1 文件结构附录 5:ASN.1 文件结构
附录 6:用十六进制、二进制和 Base64 编码和解码附录 6:用十六进制、二进制和 Base64 编码和解码
总结总结
相关链接相关链接

简介

复杂的基础结构环境和分公司部署环境通常需要使用独特的高级管理技术来管理公钥基础结构 (PKI) 或远程服务器的证书部署。网络和基础结构服务(例如域控制器、Internet 身份验证服务器 (IAS)、Internet 信息服务器 (IIS) 和其他独立应用程序)通常需要使用 X.509 证书注册或证书供应来提供或启用安全协议、消息传递或应用程序服务。然后,由于下面的某种或多种原因,在这些部署方案的许多方案中都不能使用自动系统供应,有的甚至连传统的证书注册也不能使用,这些原因有:

独立服务器未与 Active Directory? 域建立关联

防火墙关闭了必需的通信端口

由于不具备虚拟专用网络 (VPN) 或缺少通向主网络的身份验证“Internet 协议安全”(IPSec) 证书凭据而完全无法建立连接

例如,分公司域控制器可能仅通过一个防火墙连接到中心站点,而且仅对端口 25 开放了“简单邮件传输协议”(SMTP) 复制。域控制器不能通过“远程过程调用/分布式组件对象模型”(RPC/DCOM) 自动或手动注册域控制器证书,因而 SMTP 复制会失败。由于证书颁发机构位于中心站点,而防火墙又不允许 RPC 流量通过,所以分公司域控制器不能联络证书颁发机构对其证书进行注册。在这种情况下,必须通过异步过程或脱机过程来申请、处理和安装域控制器证书。本白皮书阐述了为实现一个安全的基础结构而执行 X.509 证书注册的循序渐进操作步骤,同时还附带介绍了几种远程部署方案。

支持的方案

当然,最好的情形是支持所有的环境并对这些环境进行一一介绍,但是由于某些技术限制和文档要求,这一点往往很难实现。本白皮书着重介绍了从 Windows 2000 或 Windows Server 2003 独立证书颁发机构 (CA) 或从 Windows Server 2003 企业 CA 对 Windows 2000 和 Windows Server? 2003 中的域控制器注册域控制器证书的过程。由于技术限制,本文没有详细介绍从 Window 2000 企业 CA 手动注册证书的过程。

假设

本文假设所有域控制器均已配置妥当,并正常运行。本文还假设用户已根据以下站点的白皮书中 Microsoft? 所建议的最佳实践实施了证书颁发机构:http://www.microsoft.com/technet/prodtechnol/windowsserver2003/maintain/operate/ws3pkibp.mspx

过程概述

为了使用户能对高级注册方案有一个高层次的概览,下面的图表对后面几节详细介绍的各种不同步骤和过程进行了细致地分步详解。

advcer01_big.gif
查看大图

advcer02_big.gif
查看大图

advcer03_big.gif
查看大图

返回页首返回页首

申请脱机域控制器证书

对于那些连接能力有限,或是必须通过 VPN 或 IPSec 才能连接到主要数据中心的分公司方案,通常需要借助异步注册过程才能注册或为域控制器提供 X.509 证书。域控制器的异步证书或(脱机)证书申请必须通过命令行工具来创建,这是因为操作系统本身不支持脱机注册向导(例如在 IIS 中发现的脱机注册向导)。由于任何类型的证书申请均可通过命令行工具来创建,因此在您了解了一般过程之后,还可以使用这些工具构建其他类型的证书申请。以下章节分别介绍了通过脱机过程注册域控制器证书所必需执行的步骤。

注意:在 Windows 2000 系统和 Windows Server 2003 家族操作系统之间存在着一些差异和功能变更。文中据此相应注明了不同操作系统家族之间的差异以及所需的不同过程。

准备一台 Windows 2000 域控制器

对于 Windows 2000 家族的操作系统,需要执行的第一步就是准备 Windows 2000 域控制器。由于 Windows 2000 原本并未安装可在命令行下创建证书申请的工具,因此必须借助 Windows Server 2003 工具。Windows 2000 中可用的 certreq.exe 和 certutil.exe 命令行工具版本的功能十分有限,不能满足此方案所要求的脱机证书申请处理要求。例如,Windows 2000 版本的 certreq.exe 不支持 –new(新建)选项,而这正是创建新的证书申请所必需的选项。Certutil.exe 具有许多验证和处理证书的选项。

Windows Server 2003 Administration Tools Pack(Windows Server 2003 管理工具包)中包含最新版本的 certreq.exe 和 certutil.exe,这两个最新工具是创建证书申请过程中所必需的一部分。要在 Windows 2000 计算机中安装这些工具,必须先在一个 Windows XP 或 Windows Server 2003 系统中安装 Windows Server 2003 Administration Tools Pack,因为该工具包不能直接安装到 Windows 2000 计算机上。

Windows Server 2003 Administration Tools Pack 可从以下 Web 站点处下载:
http://www.microsoft.com/downloads/details.aspx?FamilyID=c16ae515-c8f4-47ef-a1e4-a8dcbacff8e3&DisplayLang=en

要在 Windows 2000 系统中安装这些工具,请执行以下步骤。

重要:在将新文件复制到 Windows 2000 域控制器之后,这两个新版本的文件将驻留在 Windows 2000 计算机中。切勿移除 Windows 2000 系统中原本安装的文件,因为一些其他应用程序(如“证书 MMC 管理单元”)还要依靠这两个旧版本的文件才能正常运行。此外,请不要通过 regsvr32.exe 命令在 Windows 2000 系统中注册 certcli.dll 和 certadm.dll。

1.

登录一台运行 Windows XP Service Pack 1 或 Windows Server 2003 的计算机。

2.

安装 Windows Server 2003 Administration Tools Pack。

3.

将下列文件复制到可移动存储媒体(如磁盘)中。

certreq.exe

certutil.exe

certcli.dll

certadm.dll

4.

注销计算机。

5.

将可移动媒体置于适当的位置,使需要脱机域控制器证书的域控制器可以访问该媒体。

6.

以域管理员的身份登录域控制器并创建一个用来存储文件的新目录,例如 %HOMEDRIVE%\W2K3AdmPak

注意:不要在系统搜索路径中包括此路径,以避免其与计算机中现存版本工具之间产生冲突。

7.

将四个文件从可移动存储媒体复制到新创建的目录中。

生成脱机证书申请

本节适用于 Windows 2000 和 Windows Server 2003 域控制器。下一步是为域控制器生成一个脱机证书申请。正如前面提到的,您必须使用名为 certreq.exe 的命令行工具来创建脱机证书申请。此工具支持丰富的命令行选项集,不过本过程只需用到其中的几个选项。有关 certreq.exe 工具及其语法的详细信息,请参见附录 3:Certreq.exe 语法。

Certreq.exe 需要一个文本(说明)文件来为域控制器生成适当的 X.509 证书申请。您可以用首选的 (ASCII) 文本编辑器来创建文件,并以 *.inf 扩展名将文件保存到硬盘中的任意目录中。

一般情况下,用于 SMTP 复制的域控制器证书必须满足以下要求。

证书必须包含“证书模板名称”(会被对象标识符 1.3.6.1.4.1.311.20.2 所引用)扩展。

证书必须包含一个“使用者备用名称”扩展,其中包括域控制器帐户的全局唯一标识符 (GUID) 和域控制器“域名系统”(DNS) 主机名称的完全合格的域名 (FQDN)。使用者备用名称可用对象标识符 2.5.29.17 来唯一标识。

通常,将证书连接到 CA 以自动或手动注册证书时,这两个扩展都会被企业 CA 自动插入到证书中。但是,当您在脱机情况下申请域控制器证书时,必须在脱机申请中明确提供这些扩展。

在证书申请中添加扩展并最终颁发 X.509 证书的方法有几种。对于 Windows 2000 CA,您既可以在 INF 说明文件中包括扩展,也可以在挂起的证书申请中添加扩展。如果在挂起的证书申请中添加了扩展,就不必再使用 INF 说明文件来执行相同的任务。

对于 Windows Server 2003 CA,您可以使用与 Windows 2000 CA 相同的过程,也可以使用 certreq.exe 在提交证书申请时从命令行指定证书扩展。

重要:当您从 certreq.exe 命令行工具提交扩展时,不能为提交的扩展设置重要标志。因此,如果需要将扩展标记为重要,则必须使用 INF 说明文件作为提交方法。

标识域控制器 GUID

通过 SMTP 进行的 Active Directory 复制要求将域控制器 GUID 作为域控制器证书的一个属性。因此,如果要从 Windows Server 2003 企业 CA 或独立 CA 为 SMTP 复制颁发证书,则必须标识域控制器 GUID。由于域控制器的 GUID 存储在 Active Directory 中,因此有几种方法可从域控制器的计算机对象中读取此属性。您不必登录到域控制器或 CA 便可从 Active Directory 读取 GUID;任何对域中对象具有读取权限的计算机都可以顺利完成此任务。下面是从 Active Directory 确定域控制器 GUID 的过程中可能用到的部分工具列表。

Adsiedit.exe(可作为 Windows? 支持工具的一部分使用)

Ldp.exe(可作为 Windows 支持工具的一部分使用)

Dsquery.exe(可作为 Windows 支持工具的一部分使用)

Netdiag.exe(可作为 Windows 支持工具的一部分使用)

Replmon.exe(可作为 Windows 支持工具的一部分使用)

Windows Management Instrumentation (WMI)

有关详细信息,请参见以下站点处的 Microsoft 知识库文章“确定域控制器的服务器 GUID”:
http://support.microsoft.com/default.aspx?scid=kb;en-us;224544

由于在某些方案中要想轻松地标识域控制器 GUID 并非易事,因此附录 2 提供了一个脚本,以帮助您在生成证书申请时从 Active Directory 自动查询 GUID。该脚本简化了管理员的此项处理任务。有关详细信息,请参见“Reqdccert.vbs——生成域控制器证书申请”。

创建脱机证书申请

CA 所颁发的每个 X.509 证书都需要一个唯一的证书申请来启动发布过程。如果有必要,您可以创建几个证书申请,对它们进行批处理,一同提交给 CA。

不过,为了避免潜在的错误和混淆,请确保您为申请文件使用了唯一的名称。要创建证书申请,需要以本地管理员组成员的身份来创建此申请,因为只有这个组具有对域控制器的默认交互式登录权限。第一步是在 INF 文件中定义输入信息。

要创建用于为申请填充输入信息的 INF 文件,请执行下列步骤。

1.

以本地管理员组成员的身份登录到需要证书的域控制器。

2.

将附录 2 中的 reqdccert.vbs 脚本置于适当的位置,使域控制器可在本地对其进行访问。

3.

如果您计划向 Windows 2000 或 Windows Server 2003 独立 CA 提交证书申请,请从命令行提示符窗口运行脚本,不要附带任何附加参数。在这种情况下,假定使用的是域控制器证书模板,且域控制器的 GUID 和 DNS 名称会作为使用者备用名称包括在颁发的证书中。

如果您计划向 Windows Server 2003 企业 CA 提交证书申请,则必须指定用于注册的证书模板的特定名称。此名称取决于之前在“证书模板创建”中选择的证书模板名称。此外,您还必须指定证书注册是用于域控制器身份验证还是用于电子邮件复制。这是必需的,因为身份验证模板的使用者备用名称构造和电子邮件复制模板的使用者备用名称构造是不同的。

根据您的具体要求,在命令行提示符窗口中运行以下任意一种命令。

要使用自定义模板为域控制器身份验证证书创建一个证书申请:

cscript reqdccert.vbs <Templatename> A

要使用自定义模板为目录电子邮件复制证书创建一个证书申请:

cscript reqdccert.vbs <Templatename> E

要使用默认的域控制器模板创建一个证书申请:

cscript reqdccert.vbs

该脚本会创建一个 INF 文件,该文件可用作构建证书申请的输入文件。它还会创建一些附加语法,其中包含了向 CA 提交申请以对证书进行验证所需的适当命令语法。

有关脚本所执行任务的详细描述,请参见附录 2 中的“Reqdccert.vbs——生成域控制器证书申请”。

4.

打开一个命令行提示符窗口。在 Windows 2000 域控制器中键入

%HOMEDRIVE%\W2K3AdmPak\CERTREQ -new <dcname>.inf <dcname>.req

在 Windows Server 2003 域控制器中键入

CERTREQ -new <dcname>.inf <dcname>.req

用域控制器的主机名称替换 <dcname> 变量。如果您对名称不太确定,请查询当前目录中所保存的 INF 文件的名称。请注意,在命令行提示返回结果前可能要等待几秒钟,甚至几分钟。根据文件大小和系统 CPU 的可用周期,以及 INF 文件设置的密钥长度,生成密钥材料可能需要几分钟的时间。

重要:Certreq.exe 工具所执行的几个任务通常不太明显。首先,它会生成公钥材料和私钥材料,然后,它会生成实际的证书申请。密钥材料的生成过程解释了为什么必须在一台单一机器上为几台域控制器生成证书申请。每台域控制器的密钥材料都必须是唯一的,这样才能确保实现安全的解决方案。

查看证书申请

在此阶段,您已成功生成了公钥材料和私钥材料,并且还创建了证书申请。证书申请存储在文件中,保存在本地机器的证书注册申请存储区中。要查找生成的注册申请,请执行以下步骤。

1.

仍旧以本地管理员组成员的身份登录,启动“Microsoft 管理控制台”。

2.

添加“证书 MMC 管理单元”。

3.

当“添加”窗口要求您选择需要管理的证书存储区时,请选择“计算机帐户”。

4.

在“证书 MMC 管理单元”中,导航至左侧窗格中的“证书注册申请”。

证书申请会出现在右侧窗格中。预期情况下,此容器中的挂起证书申请不应超过一个。否则,就意味着存在其他已提交,但尚未获批准或未被接受的证书申请。

5.

双击证书申请时,底部的“常规”选项卡中会显示消息“您具有一个对应于此证书的私钥”。正如前面所提到的,certreq.exe 已生成了证书申请和密钥材料。当窗口顶部出现警告消息,通知您证书可能已变更时,您可以安全地忽略此警告。由于证书尚未颁发,这是一个预期的警告。

验证证书申请

建议您在将脱机域控制器证书申请发送至 CA 进行处理之前先对其进行验证。验证过程可以确保所有的申请字段均设置正确,且证书在进行处理和颁发时可以提供预期的功能。要检验前面生成的证书申请,请执行以下步骤。

仍旧以本地管理员组成员的身份登录到域控制器,在命令行提示符窗口中键入 certutil –dump <dcname>.req,然后按下 Enter 键。

使用前面一节中使用的名称替换 <dcname> 选项,生成脱机申请。如果您已正确创建了使用“域控制器”证书模板的申请,则该命令显示的输出结果将与以下输出相似:

PKCS10 Certificate Request: 
Version: 1 
Subject: 
    CN=W2K3-BO-DC.contoso2.com 
Public Key Algorithm: 
    Algorithm ObjectId: 1.2.840.113549.1.1.1 RSA 
    Algorithm Parameters: 
    05 00 
Public Key Length: 1024 bits 
Public Key: UnusedBits = 0 
    0000  30 81 89 02 81 81 00 95  b8 e9 18 84 df 95 ce 37 
    0010  ce f6 af 32 40 43 14 d5  0f 7b 3b 76 36 8c dd 8b 
    0020  7c 03 29 33 26 d3 84 c3  7e ae 25 34 ea 1e db 3a 
    0030  b9 01 e3 a7 02 3c 6b 8f  66 99 c8 ac 51 70 03 bc 
    0040  47 06 ef 2f 62 3e c3 8d  e1 51 bd 9d c8 7d 95 8c 
    0050  08 0a bf 54 a6 f3 1d 2f  cd b8 7d 17 fc 4c 7d a5 
    0060  a6 ce 90 d0 a3 21 c5 b0  c1 f0 de ae 00 43 16 cb 
    0070  eb 73 01 e7 71 79 ed dd  72 d0 cc 4a 55 26 a2 99 
    0080  03 21 dc d1 5b b4 b9 02  03 01 00 01 
Request Attributes: 4 
  4 attributes: 
  Attribute[0]: 1.3.6.1.4.1.311.13.2.3 (OS Version) 
    Value[0][0]: 
        5.2.3790.2 
  Attribute[1]: 1.3.6.1.4.1.311.21.20 (Client Information) 
    Value[1][0]: 
    Unknown Attribute type 
    Client Id: = 1 
    XECI_XENROLL -- 1 
    User: CONTOSO2\administrator 
    Machine: W2K3-BO-DC.contoso.com 
    Process: certreq 
  Attribute[2]: 1.2.840.113549.1.9.14 (Certificate Extensions) 
    Value[2][0]: 
    Unknown Attribute type 
Certificate Extensions: 4 
    2.5.29.14: Flags = 0, Length = 16 
    Subject Key Identifier 
        55 93 fd 45 5b 22 87 33 95 96 4a 77 e3 ff 08 08 f6 83 de fc 
    2.5.29.17: Flags = 1(Critical), Length = 3c 
    Subject Alternative Name 
        Other Name: 
             1.3.6.1.4.1.311.25.1= 0410 6661 6135 3636 3234 3831 6263 3866 6662 
        DNS Name=W2K3-BO-DC.contoso.com 
    2.5.29.37: Flags = 0, Length = 16 
    Enhanced Key Usage 
        Server Authentication (1.3.6.1.5.5.7.3.1) 
        Client Authentication (1.3.6.1.5.5.7.3.2) 
    2.5.29.15: Flags = 0, Length = 4 
    Key Usage 
        Digital Signature, Key Encipherment (a0) 
  Attribute[3]: 1.3.6.1.4.1.311.13.2.2 (Enrollment CSP) 
    Value[3][0]: 
    Unknown Attribute type 
    CSP Provider Info 
    KeySpec = 1 
    Provider = Microsoft RSA SChannel Cryptographic Provider 
    Signature: UnusedBits=0 
    0000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 
    Remaining 78 bytes are zero 
Signature Algorithm: 
    Algorithm ObjectId: 1.2.840.113549.1.1.5 sha1RSA 
    Algorithm Parameters: 
    05 00 
Signature: UnusedBits=0 
    0000  45 4c 4f ca 00 52 36 88  a0 2d 2e 45 f3 87 be ac 
    0010  89 4f 4e d4 19 42 a7 e5  cb 7a 15 d5 eb e2 a0 96 
    0020  6c 39 94 c5 71 d6 e7 03  10 9c 45 a0 ad c7 34 e6 
    0030  f9 f2 31 da ce e2 2e 6f  b7 23 6f 12 53 6a 40 89 
    0040  ba a9 2e 2f bc cf d4 00  72 18 82 05 33 ea 0e 20 
    0050  0b e2 5c 4c 5a 57 b5 71  08 e0 3e d8 8b 0d 18 05 
    0060  7b 11 4d b1 e9 db 16 e5  78 e8 c2 b2 ff bb c2 9d 
    0070  e6 2b 17 83 dc 1d 43 fd  4e 0e 37 58 f0 ac a9 95 
Signature matches Public Key 
Key Id Hash(sha1): 55 93 fd 45 5b 22 87 33 95 96 4a 77 e3 ff 08 08 f6 83 de fc 
CertUtil: -dump command completed successfully.

正常情况下,在证书申请的输出结果中,所生成 INF 文件的大多数属性都应出现在实际编码的证书申请中。

Reqdccert.vbs 脚本会创建一个 INF 说明文件,其中包含以编码格式表示的 DNS 名称和域控制器 GUID 的扩展信息。这样便可以使用 certreq.exe -new 选项构造所申请的证书,借助该命令,扩展信息将自动包括在 INF 文件的证书申请中。

删除证书申请

有时可能需要删除那些不需要或不使用的证书申请,有时由于 INF 输入文件中的错误甚至还要删除错误的证书申请。如果您以普通用户的身份登录,则只允许从您自己的证书存储区中删除证书申请。但是,如果您以管理员的身份登录,则还可以从计算机的证书存储区中删除证书申请。要删除证书申请,请执行以下步骤。

1.

打开计算机帐户的“证书 MMC 管理单元”(如前所述)。

2.

导航至左侧窗格的“证书注册申请”。

3.

通过在键盘上按 Delete 的方式删除右侧窗格中挂起的证书申请。

4.

关闭“证书 MMC 管理单元”。

5.

如果申请已被提交至 CA,则还需要拒绝 CA 中挂起的申请。

除非管理员明确将其删除,否则为证书申请所生成的密钥材料将始终保留在本地系统(计算机)的配置文件中。对于孤立的密钥材料,可能只能使用 certutil.exe 在命令行提示符窗口中手动删除。但是,管理员可能必须知道密钥容器才可执行此操作。

警告:如果您从计算机中手动删除了密钥,则会令所有使用该加密密钥加密的数据失效。如果您尚未实施密钥恢复机制,建议您最好在系统中保留那些未使用的密钥,不要将其删除。

使用以下命令显示机器上下文中可用的密钥容器列表。

certutil –store my

使用以下命令显示当前用户的上下文。

certutil –store –user my

输出结果将显示每个证书的密钥容器名称。密钥容器在创建时通常以随机 GUID 字符串作为其名称。

如果您已确定了特定证书的 keycontainername,则可以使用以下命令删除密钥容器。

certutil.exe -delkey <KeyContainerName>

其中 -delkey 选项仅可在 Windows Server 2003 版本的 certutil 命令中使用。在 Windows 2000 中,必须为此命令添加一个前缀。前缀即为您将 Windows Server 2003 版本的 certutil 复制到的路径。在本白皮书中,使用 %HOMEDRIVE%\W2K3AdmPak 作为路径。

将申请传递给 CA

在域控制器中生成了申请文件并对其进行验证之后,便可将该申请文件传递给 CA 进行处理和发布。在传递申请文件时,以下文件会被传递给 CA。

<dcname>-req 此文件包含域控制器中生成的证书申请。

<dcname>-req.bat 此批处理文件是由 reqdccert.vbs 创建的,其中包含正确的命令行参数,用于将申请提交给 CA。

这之后,您便可以从域控制器中注销退出了。

返回页首返回页首

处理域控制器证书

由于 Windows 2000 和 Windows 2003 中的“证书服务”组件有所不同,域控制器证书的发布流程也会随证书模板的版本和具体的证书模板而有所不同。为了帮助用户了解这两类“证书服务”所需的不同流程和步骤,下列章节中分别对这两类“证书服务”进行了详细介绍。

证书模板

Windows 2000 和 2003 Server 的企业证书颁发机构 (CA) 支持证书模板的概念。证书模板用于定义企业 CA 应当如何处理证书申请,以及在颁发证书时应如何生成特定的证书类型。Windows 2000 环境和 Windows Server 2003 Active Directory 环境中的域控制器有所不同。在您将证书提交到 CA 之前,有必要了解这两者之间的区别。有关证书模板的更广泛的讨论,请参见以下参考资料。

位于以下站点处的“在 Windows Server 2003 中实施和管理证书模板”:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03crtm.mspx

位于以下站点处的“选择证书模板”:
http://www.microsoft.com/resources/documentation/windowsserv/2003/all/deployguide/en-us/dssch_pki_gaur.asp

Windows 2000 证书模板

Windows 2000 CA 仅为域控制器证书提供了一种证书模板:域控制器。该模板可通过“组策略”中的“自动证书申请服务”(ACRS) 设置手动注册或自动注册。证书模板名称被硬编码在操作系统内,如果要注册 Windows 2000 域控制器,必须使用该证书模板。在 Windows 2000 中,您不能修改证书模板,因此只能使用域控制器模板。

有了 Windows 2000 CA 颁发的域控制器证书,域控制器便可以使用该证书完成以下任务。

为“Kerberos 中的初始身份验证公钥加密”(PKINIT) 提供交互式身份验证或提供智能卡登录。

在启用 SMTP 复制时对 Active Directory 复制流量进行加密。

在 Active Directory 的“安全套接字层”(SSL) 中启用“轻型目录访问协议”(LDAP)。

为有需要的应用程序使用 SSL 客户端身份验证功能执行身份验证。

如果在所连接的环境中启用了 Windows 2000 类型的自动注册(组策略中的 ACRS),则 Windows 2000 域控制器会基于域控制器模板自动注册证书。

Windows Server 2003 证书模板

与 Windows 2000 企业 CA 相比,Windows Server 2003 企业 CA 可以为域控制器证书提供三种模板。在 Windows Server 2003 中,域控制器证书也被称为 V1 证书模板,它可以支持 Windows 2000 域控制器的自动注册。另外两个证书模板是目录电子邮件复制域控制器身份验证。这两个证书模板都是 V2 模板,用户可对这两个模板进行修改和复制,并将其用于新式证书的自动注册。

与 Windows 2000 中的注册机制相比,加入到 Active Directory 域中的 Windows XP 和 Windows Server 2003 系统支持更高级的自动注册机制。为了在包含 Windows XP 和 Windows Server 2003 系统的混合环境中支持 Windows 2000 计算机,Windows Server 2003 CA 同时支持这两种方法。有关新型自动注册的更多信息,请参见以下站点处的白皮书:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/plan/autoenro.mspx

Windows 2000 V1 域控制器证书模板的功能被划分为两种 V2 证书模板,以便提供更细化的功能。在 Windows Server 2003 中,不再使用那种几乎可在所有场合下应用的多用途域控制器证书,取而代之的是为支持智能卡登录而量身定做的域控制器身份验证证书以及用于支持 SMTP 电子邮件复制的目录电子邮件复制证书。因此,如果不需要通过 SMTP 进行 Active Directory 复制,则不必部署目录电子邮件复制证书。

注意: 这两个证书模板均被配置为默认取代之前的域控制器证书模板,当 Windows 2000 企业 CA 和域控制器被同时升级到 Windows Server 2003 时,便会发生此取代过程。有关模板取代的更多信息,请参见以下站点处的“在 Windows Server 2003 中实施和管理证书模板”白皮书:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03crtm.mspx

为了汇总以前的知识点,下表提供了在 Windows 2000 和 Windows Server 2003 中默认使用的证书模板概览。

域控制器操作系统Windows 2000 单独 CAWindows 2000 企业 CAWindows Server 2003 独立 CAWindows Server 2003 企业 CA

Windows 2000

域控制器

域控制器

域控制器

域控制器

Windows Server 2003

域控制器

域控制器

域控制器

域控制器身份验证

目录电子邮件复制

这些相同的模板还可用于域控制器的脱机证书注册。当使用 Windows Server 2003 企业 CA 时,还需要自定义域控制器证书模板。有关此过程和要求的更多信息,请参见“证书模板配置”。

在 Windows 2000 计算机中使用第二版模板

在混合环境中,您可能支持或安装了多个操作系统版本,这时可供选择的模板版本将受客户端操作系统的限制。只有 Windows XP 客户端系统才能通过“证书 MMC 管理单元”注册第二版模板。Windows 2000 客户端不能通过“证书 MMC 管理单元”或“组策略”中的自动证书申请设置来显示或注册第二版模板。不过,通过 Windows Server 2003 Web 注册页,Windows 2000 计算机可用于注册基于第二版模板的用户证书。另外,您还可以在 Windows 2000 计算机中安装 certreq.exe,并使用该种方法基于第二版模板手动申请证书。

域控制器证书详细信息

由于许多脱机域控制器注册流程都涉及复杂的手动过程,因此以下章节提供了一些指导信息作为参考,以帮助您理解最为重要的域控制器证书特征。

证书用途域控制器域控制器身份验证目录电子邮件复制

域控制器身份验证 – 域控制器可通过智能卡登录向另一方(如客户端机器)证明自己的身份。

SSL – 如果 Web 服务器安装在域控制器中,则此 Web 服务器便可利用域控制器证书来建立与客户端的 SSL 连接。它还支持通过 LDAP 和 SSL 连接域控制器。

客户端身份验证 (SSL)– 如果机器对于另一台服务器上的其他应用程序充当 SSL 客户端,则可使用此证书。

电子邮件加密 – 用户可使用此证书对 SMTP 电子邮件进行加密和签名。

CA 基于域控制器证书模板颁发的证书具有以下特征。

主题中包含域控制器的完全合格域名,且以“CN=”的相对可分辨名称 (RDN) 元素作为前缀。

证书用途(也被称为扩展密钥用法)被设置为“客户端身份验证 (1.3.6.1.5.5.7.3.2)”和“服务器身份验证 (1.3.6.1.5.5.7.3.1)”。圆括号中的数字对应于每种证书用途的标准对象标识符 (OID)。

模板的公用名被设置为“DomainController”。

“使用者备用名称”中包含域控制器的 GUID(用 OID 表示为 1.3.6.1.4.1.311.25.1)和域控制器的完全合格域名。

基于域控制器身份验证证书模板颁发的证书具有以下特征。

证书使用者为空。

证书用途(也被称为扩展密钥用法)被设置为“客户端身份验证 (1.3.6.1.5.5.7.3.2)”、“服务器身份验证 (1.3.6.1.5.5.7.3.1)”和“智能卡登录 (1.3.6.1.4.1.311.20.2.2)”。圆括号中的数字对应于每种证书用途的 OID。

模板的公用名被设置为“域控制器身份验证”或被设置为证书申请中为此证书类型所指定的模板名称。

“使用者备用名称”扩展中包含域控制器的完全合格 DNS 名称。

基于目录电子邮件复制证书模板颁发的证书具有以下特征。

证书使用者为空。

证书用途(也被称为扩展密钥用法)被设置为“目录服务电子邮件复制 (1.3.6.1.4.1.311.21.19)”。圆括号中的数字对应于每种证书用途的 OID。

模板的公用名被设置为“DirectoryEmailReplication”或被设置为证书申请中为此证书类型所指定的模板名称。

“使用者备用名称”扩展中包含域控制器的 GUID(用 OID 表示为 1.3.6.1.4.1.311.25.1)和域控制器的完全合格域名。

Windows Server 2003 证书及其在 Active Directory 中的发布

使用域控制器证书模板或目录电子邮件复制证书模板从企业 CA 注册的证书,在默认情况下会发布到 Active Directory 的申请者对象中。证书自动注册后,申请者会自然成为域控制器。这些证书模板在 Active Directory 中发布证书的主要目的是为了使用 SMTP 对 Active Directory 内容进行加密复制;两个复制伙伴必须有权访问其复制伙伴的公钥(证书)。

只有企业证书颁发机构才能在 Active Directory 中以自动过程发布证书。如果您从独立 CA 手动注册了一个域控制器证书,则必须在 Active Directory 中手动发布此证书。一定要牢记,独立 CA 并不提供域控制器身份验证目录电子邮件复制这两种证书模板格式,因此,无论是哪种 CA 版本,您都只能从独立 CA 颁发域控制器证书。

默认情况下,使用域控制器身份验证证书模板创建的证书并不在 Active Directory 中发布,这是因为智能卡登录需要 Active Directory 中的域控制器证书。因此,建议您不要使用默认的域控制器身份验证证书模板在 Active Directory 中操作发布域控制器身份验证证书。

Windows 2000 Server CA 配置

默认情况下,Windows 2000 Server CA 不允许在证书申请中指定要接受并插入到已颁发证书中的使用者备用名称。此规则同时适用于独立 CA 和企业 CA。在提交和处理脱机域控制器证书申请时必须用到此功能。要允许执行此功能,必须修改 CA 配置。

重要: 更改 CA 的 CA 配置,以允许证书申请中的使用者备用名称作为一项全局设置,而不仅仅是一个单一模板。启用此设置后,CA 将接受使用者备用名称属性,并将其用于所有证书申请。

要将 CA 的 CA 配置更改为接受申请中的使用者备用名称,请执行下列步骤。

1.

以“管理员”身份登录到 CA。

2.

在命令行提示符窗口中,键入

CERTUTIL -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2

这将允许 CA 接受申请中所提交的“使用者备用名称”。如果您向此 CA 提交多个脱机域控制器申请,则不必再次设置参数。此设置将一直保留,直到管理员手动将其重置为默认设置为止。要将 CA 重置为默认设置,请在命令行提示符窗口中键入以下命令。

CERTUTIL -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2

注意: 此设置将会影响提交给 CA 的所有证书申请。任何提供了 SubjectAltName2 的证书申请都将被 CA 识别并处理。

3.

以下命令将显示更改前后所设置的配置参数 (EditFlags)。您可以使用以下命令来明确地检验这些参数。

CERTUTIL -getreg policy\EditFlags

4.

要在以后颁发的所有证书中启用更改,请重新启动证书颁发机构服务。要重新启动 CA,请在命令行提示符下键入以下命令,然后按下 Enter 键。

NET STOP certsvc & NET START certsvc

使用 Windows 2000 CA 发布域控制器证书

安装在 Windows 2000 计算机中的 CA 可以同时为 Windows 2000 和 Windows Server 2003 域控制器颁发域控制器证书申请。

在 Windows 2000 CA 中,没有可用于自定义域控制器证书模板的选项。不过,您可以设置特定 CA 上域控制器的有效时间,这是一个有使用限制的选项。有关如何更改有效时间的信息,请参见 Microsoft 知识库文章操作指南:更改 Windows Server 2003 或 Windows 2000 Server 证书颁发机构所颁发证书的截止日期,文章位于:
http://support.microsoft.com/default.aspx?id=254632

Windows 2000 独立 CA

要颁发域控制器证书,独立 CA 是域成员还是工作组成员都没有什么关系。因为在这两种配置下都可以颁发域控制器证书。独立 CA 并不支持证书模板,因此不需要在这方面进行选择。独立 CA 会根据申请中提供的信息来处理证书申请。

要从 Windows 2000 CA 为域控制器颁发证书,可以使用以下两种方法中的任意一种。

用 Windows Server 2003 版本的 certreg.exe 准备一份证书申请,此版本的 certreg.exe 在使用者备用名称中包括域控制器 GUID 及其 DNS 名称。

使用一般证书申请,当证书申请在 CA 中挂起时为其添加证书扩展。

在第一种情况中,您在证书申请中包括了使用者备用名称,因此在颁发证书之前,不需要再将证书申请状态设置为挂起。

鉴于本白皮书介绍了如何在“证书模板配置”的证书申请中包括使用者备用名称,在接下来的章节中将介绍如何操作挂起的申请。您还可以在以下过程中使用不同的命令行参数集,以用于其他的证书类型。

建议: 从技术角度看,这两种方法都可产生相同的证书颁发结果。不过,相比较而言,在证书申请中包括扩展的方法更方便一些,因为它不需要对挂起的申请进行额外的操作。但是,此方法需要使用 Windows Server 2003 版本的 certreq.exe。

Windows 2000 CA 配置

在设置了 EditFlag(请参见 Windows 2000 Server CA 配置)之后,您应当确保策略模块已将所有等待颁发的证书置于挂起模式中。要确认 CA 的申请处理过程,请执行下列步骤。

1.

登录到 Windows Server 2000 独立 CA 所在的计算机。

2.

打开“证书颁发机构 MMC 管理单元”。

3.

在左侧窗格中选择 CA 对象,并在“操作”菜单中选择“属性”。

4.

在“策略模块”选项卡中,单击“属性”。

5.

确认已将独立 CA 的策略模块设置为以下值。

将证书申请的状态设置为挂起。

注意: 独立 CA 默认将证书申请状态设置为挂起。

6.

单击两次“确定”确认设置,并关闭“属性”页。

7.

关闭“证书颁发机构 MMC 管理单元”。

颁发域控制器证书

与 Windows 2003 CA 相比,要想在 Windows 2000 CA 中颁发包含给定使用者备用名称集的证书,过程要复杂得多。Windows 2000 CA 不像 Windows Server 2003 CA,您不能在提交证书时指定证书扩展(如使用者备用名称)。因为 Windows 2000 CA 不支持此功能。要突破此限制,您必须在证书申请中包括证书扩展,或通过三个不同步骤(外加第四个可选步骤)来执行证书注册过程。

1.

提交证书申请。

2.

在挂起的证书申请中设置证书扩展。

3.

批准并颁发证书。

4.

对证书进行手动验证,以确保其准确性。

下列步骤显示了如何提交申请、处理申请、验证申请和颁发证书。在这种情况下,证书申请中不包括证书扩展。

提交证书申请

1.

登录到 Windows Server 2000 独立 CA 所在的计算机。

2.

将之前在域控制器中创建的证书申请 (<dcname>.req) 和批处理脚本 (<dcname>-req.bat)(请参见“创建脱机证书申请”)复制到 CA 的工作文件夹中。

3.

在命令行提示符窗口中,使用 <dcname>-req.bat 脚本运行所需的 certreq 命令。批处理文件会使用下列命令将证书申请便捷地提交给 CA。

certreq -attrib "CertificateTemplate:DomainController" <dcname.req>

4.

执行上述命令后,将出现一个窗口,您可在其中选择用于颁发证书的 CA。选择“Windows 2000 颁发 CA”,并单击“确定”。

5.

记录下命令完成后所显示的 RequestID。

处理证书申请

下一个步骤就是用 Windows 2000 或 Windows Server 2003 版本的 certutil 为挂起的证书申请设置证书扩展。

重要: 以下命令将会覆盖与给定 OID 相匹配的证书申请中的全部现有信息。例如,如果您已将使用者备用名称指定为证书申请的一部分,则使用此命令会覆盖掉使用者备用名称。

1.

从域控制器将 <dcname>.asn 文件复制到 CA 计算机。

2.

在命令行提示符窗口中,运行以下命令。

certutil -setextension <RequestID> 2.5.29.17 1 @<dcname>.asn

依靠 OID 2.5.29.17 来识别的使用者备用名称是用 <dcname>.asn 文件中定义的属性所设置的。第四个参数被设置为“1”,表明该扩展是关键的。有关 ASN 文件的文件结构说明,请参见附录 5:ASN.1 文件结构。

验证挂起的证书申请

您可以对挂起的证书申请进行检验,以确保在其中正确插入了扩展。如果出现错误或是证书申请不符合您的要求,则可以在此时进行信息验证以确保其准确无误。但是,Windows 2000 CA 不支持在“证书颁发机构 MMC 管理单元”中查看挂起证书申请的属性。要检验证书是否会用正确的模板来颁布,可以使用 Windows 2000 或 Windows Server 2003 版本的 certutil。

1.

从命令行提示符窗口运行以下命令。

certutil -view -restrict RequestID=<RequestID> -out RequestAttributes

用前面记录的 RequestID 替换此处的 <RequestID>。

命令输出窗口看起来与以下结果类似:

Row 1: 
  Request Attributes: "CertificateTemplate:DomainController"

2.

要查看所有挂起证书申请的申请属性,请运行以下命令。

certutil -view -restrict disposition=9 -out RequestID,RequestAttributes

3.

确保证书扩展已正确设置。在命令行提示符窗口键入以下命令。

certutil -view -restrict RequestID=<RequestID> -out ext:2.5.29.17

用前面记录的 RequestID 替换此处的 <RequestID>。“2.5.29.17”值代表您所引用证书扩展的 OID。如果您不知道扩展的确切 OID,请使用“all”来代替具体的 OID。例如:

certutil -view -restrict RequestID=<RequestID> -out ext:all

确保您在前一章节所配置的扩展出现在挂起的证书申请中。

注意: 所有 certutil -view 命令均可用来查询 Windows 2000 或 Windows Server 2003 CA 上的证书颁发机构数据库。理解了这个架构之后,只要有适当的字段名称,便可以查询数据库。您还可以使用 certutil -view -? 命令获得更多的数据库查询示例。

颁发和检索证书

接下来,您必须颁发挂起的证书。在此章节中,您可以使用 Windows 2000 或 Windows Server 2003 版本的 certutil。

1.

要颁发挂起的申请,请打开“证书颁发机构 MMC 管理单元”。在命令行提示符窗口中运行 certsrv.msc,然后按下 Enter。

2.

在左侧窗格中单击“挂起的证书”容器。

3.

在右侧窗格中,选择对应于前面所记录 RequestID 的证书。

4.

在“操作”菜单中选择“所有任务 – 颁发”。

此外,您还可以从命令行使用以下命令来颁发证书。

certutil –resubmit <RequestID>

用之前 certreq 命令所记录的 RequestID 值替换此处的 <RequestID>。

5.

在颁发证书之后,您必须将证书存储为文件以便于将其传送给域控制器。以下命令将创建两个证书文件。CER 文件只包含域控制器证书;P7B 文件则同时包含域控制器证书以及其父证书。在命令行提示符窗口中,运行以下命令。

CERTREQ -retrieve <RequestID> <dcname>.cer <dcname>.p7b

用前面命令中使用的 RequestID 替换此处的 <RequestID>。

执行上述命令后,将出现一个窗口,您可在其中选择颁发证书的 CA。

6.

选择颁发 CA 并单击“确定”。

7.

将检索得到的证书存储在磁盘或其他媒体上以便于将其传送给域控制器。

8.

注销 CA。

要在域控制器中安装证书,请参见“域控制器证书安装”。

Windows 2000 企业 CA

但是,由于以下原因,域控制器证书不能从 Windows 2000 企业 CA 中手动发布。

Windows 2000 CA 只支持硬编码证书模板,所以不能复制和自定义默认的证书模板。如果对初始域控制器证书执行了此操作,则所执行操作将会影响到所有可连接到 CA 且使用自动注册申请证书的其他域控制器。

Windows Server 2000 CA 总是立即颁发证书,它不会将证书挂起。由于 CA 上的提交界面在 Windows 2000 中的功能十分有限,证书操作需要在挂起状态下进行,因此对脱机域控制器的支持便成了一个显著的问题。

因此,如果需要支持脱机证书申请处理,建议您安装 Windows 2000 独立 CA 或 Windows Server 2003 CA。

使用 Windows Server 2003 CA 颁发域控制器证书

Windows Server 2003 企业 CA 可以支持 V2 模板以及基于每个模板的挂起申请,还支持从企业 CA 和独立 CA 提交注册申请中的申请属性。以下章节分别介绍了每种 CA 类型颁发域控制器证书的独特过程。如果 CA 安装在 Windows Server 2003 Enterprise Edition 中,则只有 V2 模板可用。

Windows Server 2003 独立 CA

独立 CA 根据固定的规则来颁发证发,这些规则与模板中的规则相似。正如先前所描述的,独立 CA 的证书颁发与域控制器证书模板的证书颁发相似;因此,您不能使用这种 CA 类型注册目录电子邮件复制证书或域控制器身份验证证书。

手动颁发证书时,独立 CA 是域成员还是工作组成员都没有什么关系。因为 Windows Server 2003 独立 CA 同时支持这两种配置,而且在运行 reqdccert.vbs 时,证书申请中包括使用者备用名称信息,因此要正确处理这些申请不需要再将这些申请设置为挂起状态。

要从独立 Windows Server 2003 CA 颁发域控制器证书,请执行下列步骤。

1.

登录 CA 计算机。

2.

将之前在域控制器上创建的证书申请和批处理脚本 (<dcname>-req.bat) 一同复制到 CA 的工作文件夹中。

3.

从命令行提示符窗口,运行 <dcname>-req.bat 脚本来执行 certreq 命令。脚本会根据 DomainController 证书模板申请一个证书,因为没有其他的模板可执行此任务。

批处理文件包含以下命令。

CERTREQ -retrieve <RequestID> <dcname>.cer <dcname>.p7b

4.

执行上述命令后,将出现一个窗口,您可在其中选择用于发布证书的 CA。选择颁发 CA 并单击“确定”。

5.

记录下命令完成后所显示的 RequestID。在以后会用到此值。

6.

如果注册处理被设置为独立 CA 上的默认配置,则必须审批并颁发挂起证书。如果 CA 被配置为自动颁发证书,请跳过以下步骤,执行步骤 15。

7.

要检验或颁发挂起的申请,请打开“证书颁发机构 MMC 管理单元”。

8.

单击左侧窗格中的挂起的证书容器。

9.

在右侧窗格中,选择对应于步骤 5 所记录 RequestID 的证书。

10.

在“操作”菜单中选择“所有任务 - 查看属性/扩展”。

11.

这将打开一个显示有申请属性的窗口。单击“扩展”选项卡。

12.

检验“使用者备用名称”标记的值。此值应当显示为十六进制编码的 GUID 和域控制器的 FQDN。

13.

单击“确定”关闭窗口。

14.

保持右侧窗格中证书申请的选中状态,在“操作”菜单中选择“所有任务 - 颁发”。

此外,您还可以从命令行提示符窗口中使用以下命令来颁发证书。

certutil –resubmit <RequestID>

用步骤 5 中所记录的 RequestID 替换此处的 <RequestID> 变量。

15.

在颁发证书之后,您必须将证书存储为文件以便于将其传送给域控制器。以下命令将创建两个证书文件。CER 文件只包含域控制器证书;P7B 文件则同时包含域控制器证书以及其父证书。在命令行提示符窗口中,运行以下命令。

CERTREQ -retrieve <RequestID> <dcname>.cer <dcname>.p7b

用前面命令中使用的 RequestID 替换此处的 <RequestID>。

16.

执行上述命令后,将出现一个窗口,您可在其中选择颁发证书的 CA。选择颁发 CA 并单击“确定”。

17.

将检索得到的证书存储在磁盘或其他媒体上以便于将其传送给域控制器。

18.

注销 CA。

接下来,继续进行“域控制器证书安装”。

Windows Server 2003 企业 CA

企业 CA 可在 Active Directory 中为所有证书申请的处理和颁发维护和使用证书模板。因此,企业 CA 会根据分配给 CA 的可用模板来格式化和颁发域控制器证书。如果要颁发脱机域控制器证书,则必须对 Active Directory 中的默认证书进行修改,从而支持注册处理。

由于接下来的章节需要使用 V2 模板,因此假设企业 CA 安装在装有 Windows Server 2003 Enterprise Edition 的服务器上。

证书模板创建

在以下步骤中,将创建一些现有域控制器证书模板的副本,用以支持脱机申请处理。下面是进行修改的两个主要原因。

默认情况下,脱机的目录电子邮件复制证书模板会在 Active Directory 中发布证书。一般情况下,这样便足以满足要求;但是,CA 会将颁发的证书发布到证书申请者的 Active Directory 对象中,而不是发布到证书使用者的 Active Directory 对象中。在手动提交证书申请时,申请者一般就是创建证书申请的用户帐户。因此,CA 可能会在管理员的 Active Directory 用户对象中发布一个域控制器证书。为了解决此问题,我们创建了一个新的证书模板,该证书模板不需要 CA 在 Active Directory 中发布域控制器证书。有关手动发布证书的信息,请参见“发布域控制器证书”。

目录电子邮件复制证书模板和域控制器身份验证证书模板都需要特殊的模板标记来启用脱机申请处理。对于那些负责处理所有常规域控制器证书的现有模板,为了保持其完整性,我们制作了这两个模板的副本,以进行特殊设置。

注意: 建议您不要操作目录电子邮件复制域控制器身份验证默认模板。因为可以连接到企业 CA 的 Windows Server 2003 域控制器会使用这两个模板进行自动注册。对这两个模板的修改可能会使企业 CA 所连接域控制器的自动注册服务被中断。

请执行下列步骤复制默认的域控制器证书模板。

1.

在装有 Windows Server 2003 管理工具 (AdminPak.nsi),同时为企业 CA 所在林的成员的域计算机上,以“企业管理员”的身份登录。由于证书模板都存储在 Active Directory 中,因此,Active Directory 森林中的任何计算机都可对这些证书模板进行维护。在这种情况下,不需要连接到 CA。默认情况下,只有“企业管理员”组成员才具有更改证书模板的权限。

2.

单击“开始”按钮,然后指向“运行”。键入 certtmpl.msc,并按下 Enter。

3.

这将打开证书“模板 MMC 管理单元”。在右侧窗格中,选择“目录电子邮件复制”模板。

4.

在“操作”菜单中选择“复制”模板。

5.

这将打开新模板的“属性”窗口。在“常规”选项卡中,键入脱机目录电子邮件复制,作为模板的显示名称。单击“在 Active Directory 中发布证书”复选框。

从技术角度讲,可以使用任何模板名称;但是建议您使用有意义的标签。

6.

单击“使用者名称”选项卡。单击选择申请选项中的“提供”,并单击“确定”。

7.

在右侧窗格中,选择“域控制器身份验证”模板。

8.

在“操作”菜单中选择“复制”模板。

9.

这将打开新模板的“属性”窗口。在“常规”选项卡中,键入脱机域控制器身份验证,作为模板的显示名称。“在 Active Directory 中发布证书”复选框已清除,这是因为默认情况下在 Active Directory 中不会发布身份验证证书。

10.

单击“使用者名称”选项卡。单击选中申请选项中的“提供”,并单击“确定”。

11.

关闭“证书模板 MMC 管理单元”。

证书模板配置

请注意,对于运行 Windows Server 2003 Service Pack 1 或更新版本的 CA,不需要更改模板。如果已在 CA 中安装了 Windows Server 2003 Service Pack 1 或更新版本,请继续执行“颁发域控制器证书”。

通常,企业 CA 会从 Active Directory 的申请者对象中读取存储在几个证书属性中的信息。例如,域控制器公用名或 GUID 均来自域控制器的计算机对象,它们都通过手动注册过程或是常规的自动注册过程被插入到新的域控制器证书中。如果域控制器证书是通过脱机过程或异步过程手动申请的,则必须在证书申请中明确指定证书所需的全部信息。

在向 CA 提交证书时,申请中包含一个证书模板公用名字段,CA 随后会使用此字段来确定注册和颁发策略。这种策略的内容涉及申请能否定义使用者名称和使用者备用名称。默认情况下,这些属性不必在证书申请中设置,而 CA 也会忽略申请中的这些信息。需要重点注意的是,自动注册要求申请中不能包含使用者信息,只有这样才能正确处理申请。

要配置 CA,使其允许在证书申请中指定使用者备用名称,必须对先前章节中所创建的证书模板进行修改。幸亏,这种修改是一次性操作,而且在注册了域控制器证书之后,也不需要恢复此更改。模板更改与 Active Directory 环境中的任何其他属性值更改一样,可以复制,而且还不会对架构产生任何更改。

要在颁发脱机域控制器证书之前配置和应用模板修改,请执行下列步骤。

1.

在企业 CA 所在林的成员计算机上,以“企业管理员”的身份登录。

2.

如 FixDCtemplate.vbs 中所示,将脚本置于适当的位置,使本地计算机可以访问它。

3.

运行下列具有指定参数的脚本。

fixdctemplate.vbs <Templatename>

用模板的公用名 OfflineDirectoryEmailReplication 替换此处的 <Templatename>。(请不要使用空格。)

有关脚本所执行各个步骤的更多信息,请参见 FixDCtemplate.vbs。

4.

再次运行下列具有指定参数的脚本。

fixdctemplate.vbs <Templatename>

这一次,用模板的公用名 OfflineDomainControllerAuthentication 替换此处的 <Templatename>。(请不要使用空格。)

5.

注销计算机。

Windows Server 2003 CA 配置

在上一节中,我们创建并配置了证书模板。在整个森林中复制了 Active Directory 中的更改后,CA 即可访问和使用这些模板。但是,为了使 CA 能够根据模板来使用和颁发证书,必须先在每个 CA 中手动发布模板,然后才可使用。

要在企业 CA 中发布模板,请执行下列步骤。

1.

以本地机器管理员的身份登录到 CA 所在的计算机中。

2.

打开“证书颁发机构 MMC 管理单元”。

3.

展开右侧窗格中的 CA 对象,选择“证书模板”。

4.

在“操作”菜单中选择“新建 - 要颁发的证书模板”。

5.

然后将出现一个模板选择窗口。按住 <CTRL> 键,选择“脱机目录电子邮件复制”模板和“脱机域控制器身份验证”模板。

6.

单击“确定”,向 CA 中添加模板。

这两个模板将会出现在“证书颁发机构 MMC 管理单元”的右侧窗格中。

7.

关闭“证书颁发机构 MMC 管理单元”。

使用 Windows Server 2003 CA 颁发域控制器证书

使用 Windows Server 2003 企业 CA 颁发域控制器证书的步骤与使用 Windows Server 2003 独立 CA 颁发域控制器证书的过程类似。但是,由于 Windows Server 2003 企业 CA 支持新型的目录电子邮件复制域控制器身份验证证书模板,因而不再使用域控制器模板。

根据所用的具体证书模板,需要将不同的属性指定为使用者备用名称。目录邮件复制证书模板需要在此扩展中包括域控制器 GUID 及其完全合格 DNS 名称 (FQDN)。域控制器身份验证证书模板则只需要在使用者备用名称扩展中包括 FQDN。因此,您会发现这两种证书的 INF 文件和证书申请看起来不太一样。

重要: 对于脱机域控制器证书申请,请不要使用域控制器证书模板,因为 Windows Server 2003 CA 会用目录电子邮件复制域控制器身份验证证书模板来取代这个证书模板。如果您使用域控制器证书模板,会收到编号为 0x80094803 的错误。

要从 Windows Server 2003 企业 CA 颁发域控制器证书,请执行以下步骤。

1.

登录到 CA 计算机。

2.

将在前面步骤中创建的证书申请和批处理脚本 (<dcname>-req.bat) 一同复制到 CA 的工作文件夹中。

3.

在命令行提示符窗口中,使用 <dcname>-req.bat 脚本运行 certreq 命令。脚本会根据给定的证书模板申请一个证书。

如果使用的是目录电子邮件复制证书模板,则批处理文件将包含以下命令。

CERTREQ?-attrib?"CertificateTemplate:<TemplateName>" <requestfile>

执行上述命令后,将出现一个窗口,您可在其中选择用于颁发证书的 CA。

4.

选择颁发 CA 并单击“确定”。

5.

如果您在某个域控制器证书模板或 CA 策略模块配置中更改了默认注册处理过程,则应记下上一个命令结束后所显示的 RequestID,以在颁发挂起证书时使用。否则,将会出现一个“保存”窗口,您可在其中设置证书文件的名称。键入证书名称,并单击“确定”。继续步骤 9。

6.

如果证书申请被挂起,请在命令行提示符窗口中运行以下命令。否则,继续执行步骤 7。

certutil –resubmit <RequestID>

用之前所记录的 RequestID 替换此处的 <RequestID>。

7.

在颁发证书之后,您必须将证书存储为文件以便于将其传送给域控制器。以下命令将创建两个证书文件。CER 文件只包含域控制器证书;P7B 文件则同时包含域控制器证书以及其父证书。在命令行提示符窗口中,运行以下命令。

CERTREQ -retrieve <RequestID> <dcname>.cer <dcname>.p7b

用前面命令中使用的 RequestID 替换此处的 <RequestID>。

8.

执行上述命令后,将出现一个窗口,您可在其中选择颁发证书的 CA。选择颁发 CA 并单击“确定”。

9.

½«检索得到的证书存储在磁盘或其他媒体上以便于将其传送给域控制器。

10.

注销 CA。

返回页首返回页首

域控制器证书安装

在域控制器中安装证书意味着本地系统(计算机)将可以访问该证书及其相关联的私钥。由于前面已经生成了密钥材料,且证书申请在域控制器中仍处于挂起状态,因此必须接受(安装)此证书。接受是指在证书与密钥材料之间建立连接,并从证书注册申请容器中删除证书申请。

在管理员接受证书之后,certreq 会首先查看本地机器存储区中的证书注册申请容器,如果没有发现相应申请,会接着查看当前用户(管理员)的证书注册申请容器。因此,您可以以管理员的身份接受机器证书申请。

安装域控制器证书

以下过程将在本地系统配置文件(而非 Active Directory)中安装域控制器证书。要在目标域控制器中安装证书,需要使用 Windows Server 2003 版本的 certreq 和 certutil 执行以下步骤。在 Windows 2000 域控制器上,您必须为此命令添加一个前缀。该前缀即为您将命令复制到的路径。在本白皮书中,使用 %HOMEDRIVE%\W2K3AdmPak 作为路径。

1.

登录目标域控制器。

2.

将上一节中创建的 CER- 和 P7B-file 置于适当位置,使域控制器可以访问到它们。

3.

从命令行提示符窗口,运行以下命令。

CERTREQ -ACCEPT <dcname>.p7b

用目标域控制器名称替换此处的 <dcname>。此命令不会报告任何成功确认。

4.

在命令行提示符窗口中运行以下命令,以确认已将证书安装到了本地系统的个人证书存储区中:

certutil -viewstore My

执行上述命令后,将出现一个窗口,其中显示了本地计算机个人存储区中的所有证书。

5.

注销域控制器。

发布域控制器证书

正如前面所提到的,独立 CA 不能在 Active Directory 中发布证书。但是,SMTP 复制却需要使用在 Active Directory 中发布的域控制器证书。对于通过脱机过程进行异步注册的证书,您必须在 Active Directory 中手动发布这些证书。

在 Active Directory 中发布新证书之前,以下步骤将指引您检查驻留在域控制器本地机器中的证书。在新证书发布之后,您可以检验新证书是否已正确发布。

将证书发布到 Active Directory 的计算机对象中需要具有 userCertificate 属性的写入权限,该属性是任意计算机对象的一部分。默认情况下,管理员和内置域组“证书发布者”的组成员具有此权限。

Reqdccert.bat 脚本会创建一个称为 <dcname>-vfy.bat 的文件,其中包含了正确的 certutil 命令,可用于检验 Active Directory 中的域控制器证书。您可以使用这个批处理文件代替以下步骤中手动键入的 certutil –viewstore 命令。

执行下列步骤,在 Active Directory 中手动查看或发布域控制器证书。

1.

在目标域控制器中,以域管理员或“证书发布者”全局组成员的身份登录。从技术角度讲,可以在任何域成员计算机中执行发布操作,但是为了方便起见,我们在此方案中使用的是域控制器。

2.

请确保在域控制器的 Active Directory 对象中尚未发布过任何证书。

注意:以下步骤仅可在 Windows Server 2003 版本的 certutil.exe 中使用。因此,如果您从 Windows 2000 域控制器执行以下步骤,则必须在 certutil 命令行中添加一个前缀。此前缀即为您将 certutil 命令复制到的路径。在本白皮书中,使用 %HOMEDRIVE%\W2K3AdmPak 作为路径

从命令行提示符窗口运行以下命令。

certutil -viewstore “ldap:///cn=<dcname>,ou=domain controllers,dc=<domainname>,dc=<com>?usercertificate”

用目标域控制器的名称替换此处的 <dcname> 变量,并用适当的域后缀替换 <domainname> 和 <com> 变量名称。

执行上述命令后,将出现一个不包含证书的窗口。这正是我们所期望的,因为还没有发布证书。

3.

单击“取消”关闭窗口。

4.

在 Active Directory 中使用机器帐户中的 userCertificate 属性为域控制器发布证书。运行以下命令,将证书写入到域控制器的 Active Directory 对象中。

certutil –f –dspublish <dcname>.cer machine

用目标域控制器名称替换此处的 <dcname> 变量。

此命令会根据证书中的使用者信息确定适当的 Active Directory 对象。如果根据使用者信息没有发现适当的对象,发布将会失败。

注意: 在前面的命令示例中,使用“machine”参数是一个强制性要求。

5.

要检验证书是否已成功发布,请从命令行提示符窗口中执行以下步骤。

certutil?-viewstore?“ldap:///cn=<dcname>,dc=<domainname>,dc=<com>?usercertificate”

如果域控制器的计算机对象在 userCertificate 属性中不包含任何证书,则 certutil 的输出结果将是一个包含空白列表的窗口。如果命令行参数中缺少“?userCertificate”,或是指定了无效的对象类,将会显示以下错误消息:

CertUtil:-viewstore command FAILED:0x80092009 (-2146885623) CertUtil:Cannot find the requested object.

注意: 在申请者的 Active Directory 对象中检验证书不失为一种良好的做法。如果证书模板尚未正确配置,且被配置为在 Active Directory 中发布证书,则这些证书很可能会被发布到创建证书申请的用户帐户中。要在域管理员的 Active Directory 用户对象中检查证书,请运行以下命令。

certutil –viewstore “ldap:///cn=Administrator,cn=Users,dc=<domainname>,dc=<com>”

如果在此对象中发现了计算机证书,请遵循“从 Active Directory 计算机对象中移除证书”中的操作规程将其移除。

返回页首返回页首

移除域控制器证书

有时,可能需要从本地证书存储区或远程 Active Directory 中移除或删除一些不需要的证书,来更正错误或执行定期的系统清理。以下章节介绍了执行这些活动的过程。不过,从证书存储区或 Active Directory 对象中移除证书并不是域控制器证书所特有的。此过程对于所有用户或计算机证书类型都是相同的。

从本地存储区中移除证书

有时,为了确保域控制器或其他应用程序只使用有效的证书,您可能需要从本地域控制器中移除某些证书。由于域控制器证书的目的是为了对复制流量进行加密,而复制数据在复制完成之后便会被丢弃,不需要再对这些信息进行解密,因此有必要从域控制器中将已过期和已吊销的证书移除。进而将这些证书从本地机器配置文件中安全地删除。

要从专用域控制器中移除证书,请执行以下步骤。

1.

以本地管理员组成员的身份登录,启动“Microsoft 管理控制台”。

2.

添加“证书 MMC 管理单元”。

3.

当系统提示您选择要管理的帐户时,选择“计算机帐户”。

4.

在“证书 MMC 管理单元”中,导航至左侧窗格中的“个人”。

5.

在右侧窗格中,通过“证书模板”列中显示的模板名称确定域控制器证书,或按照其预期目的进行选择。

6.

选择“操作”菜单的“删除”,删除证书。

7.

关闭“MMC 管理单元”并注销。

从 Active Directory 计算机对象中移除证书

在某些情况下,您可能需要将 Active Directory 对象中存储的证书明确地移除。此现象通常发生在手动注册证书的情况中。当系统认定 Active Directory 对象中的证书已过期或已吊销时,Windows XP 和 Windows Server 2003 中的自动注册功能可以从 Active Directory 对象中将这些证书移除。同样,当 Active Directory 对象中有新证书发布时,CA 也会将过期证书移除。有关自动注册所执行功能的更多信息,请参见 Windows Server 2003 白皮书中的“证书自动注册”:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/autoenro.mspx

要从 Active Directory 域控制器对象中手动移除证书,请执行以下步骤。

1.

在装有 Windows Server 2003 版本的 certutil 的域成员计算机中,以域管理员或企业管理员的身份登录。

注意:以下步骤仅可在 Windows Server 2003 版本的 certutil.exe 中使用。因此,如果您从 Windows 2000 域控制器执行以下步骤,则必须在 certutil 命令行中添加一个前缀。此前缀即为您将 certutil 命令复制到的路径。在本白皮书中,使用 %HOMEDRIVE%\W2K3AdmPak 作为路径

2.

在命令行提示符窗口中,运行以下命令并按 Enter。

certutil?-viewdelstore?"ldap:///cn=<dcname>,ou=domain?controllers,<domainname>?usercertificate"

此命令包含对象的可分辨名称并明确指定了 LDAP 属性。如果缺少 LDAP 属性,或是指定的属性无效,此命令将会失败并给出“拒绝访问”的错误消息。

对于域控制器证书,证书始终存储在 userCertificate 属性中。不过,用户对象还可能在其他应用程序的 usercertuserSMIMEcertificate 属性中存有证书,这种应用程序的示例有 OutLook,它使用这些属性作为存储证书的首选属性。

执行上述命令后,将出现一个窗口,其中显示了用户对象中的证书队列。如果给定属性的指定对象中包含证书,则这些证书会显示在窗口中。如果不存在有效证书,窗口中将显示空白列表。

3.

要移除特定证书,请选择证书并单击“确定”。

窗口将关闭,且命令行提示中会显示一条状态消息,与下面所示的消息类似:“已移除证书 <证书使用者名称>”,其中 <证书使用者名称> 显示的是证书的使用者名称。

4.

要关闭窗口,但不删除证书,请单击“取消”。

返回页首返回页首

疑难解答

尽管本白皮书详细介绍并记录了一些过程,但在某些特定方案和环境中,还是有可能会遇到一些需要解决的疑难问题。本节包含了为白皮书中所介绍的过程准备的一些常见错误和疑难解答提示,以帮助您解决环境中存在的潜在问题。

第一个疑难解答工具可为应用程序或工具显示的错误代码提供完整的描述文本。如果出现意外错误,您可以使用以下命令来显示对应的错误消息文本。

certutil –error <Hexadecimal_Error_ID>

例如,为了查看错误 0x80094800 的错误文本,您可在命令行提示符窗口中运行以下命令。

certutil –error 0x80094800

域控制器证书出现在用户对象中

在注册和颁发证书的过程中,如果 CA 的证书模板被配置为在 Active Directory 中发布证书,CA 便会选择申请者的 Active Directory 对象,而非域控制器的计算机对象。要更正这个问题,请遵循“从 Active Directory 计算机对象中移除证书”中的步骤。

Certreq – 新建失败,错误 0x80092023

如果没有按 X.500 的格式指定使用者名称,则可能发生此错误。您不能只是指定原始字符串作为公用名。至少要将前缀“CN=”添加到字符串中。

Certreq – 提交失败,错误 0x80094800

提交证书申请时,如果 CA 中的模板不可用,则会发生此常见错误。要更正这个问题,请确保模板名称在证书申请中,或作为 -attrib 参数的拼写正确。另外,还请您检查一下是否执行了 Windows Server 2003 CA 配置中的步骤,这一点很重要。

Certreq – 提交失败,错误 0x80094001

如果您在申请证书时使用 V1 域控制器证书模板执行了“使用 Windows Server 2003 CA 颁发域控制器证书”中描述的步骤,且在证书申请中包含了使用者名称或使用者备用名称,就会发生此错误。V1 域控制器模板会指导企业 CA 从 Active Directory 中读取申请者的使用者名称,但是此功能不能用于手动证书申请。很显然,Active Directory 中的管理员用户对象永远也不会具有适当的域控制器使用者名称。

您不能使用企业 CA 中的 V1 证书模板手动注册证书申请。

Certreq –提交失败,错误 0x80094803

此错误通常发生在证书模板不允许在证书申请中明确指定使用者名称或使用者备用名称的情况下。默认情况下,在证书中构建使用者名称或使用者备用名称时,模板只允许从 Active Directory 检索信息。要为脱机证书注册更正此错误,可运行附录 2 中的 fixdctemplate.vbs 脚本来修改特定模板。

要检验模板中使用者备用名称的强制属性,请使用 Windows Server 2003 版本的 certutil,在命令行提示符窗口中下运行以下命令。在 Windows 2000 计算机中,必须为此命令添加一个前缀。该前缀即为您将命令复制到的路径。在本白皮书中,使用 %HOMEDRIVE%\W2K3AdmPak 作为路径。您必须在 Active Directory 林中,以“通过验证的用户”组成员的身份登录。

Certutil –v –dstemplate {CertificateTemplate_commonname}

例如,键入

certutil -v -dstemplate OfflineDomaincontrollerauthentication

此命令将显示指定模板的属性。在输出结果中检查 msPKI-Certificate-Name-Flag 之后的参数。输出结果中禁用缩进参数。确保您在证书申请中指定的所有属性均不会在模板属性输出结果中缩进。

Certreq – 提交失败,错误 0x8009480e

向 CA 提交证书申请时,如果 CA 中的模板不可用,则常会发生此错误。这种错误也可以通过运行附录 2 中的 fixtemplate.vbs 脚本来更正。另请参见“Certreq – 提交失败,错误 0x80094803”。

Certutil –viewstore 显示一个不包含证书的空白对话框

当在命令行参数中指定了一个无效对象类时,常会发生此错误。您可以在 Windows Server 2003 CD-ROM 中使用“Windows Server 2003 支持工具”中的 ADSIedit 来识别正确的对象类及其可分辨名称。

返回页首返回页首

附录 1:识别域控制器 GUID

对于那些不熟悉 Active Directory 与目录中域控制器对象之间细微差别的管理员来说,识别 SMTP 复制证书的正确域控制器 GUID 可能是一项巨大的挑战。要从 Active Directory 林中的 Windows XP 或 Windows Server 2003 计算机确定特定的域控制器 GUID,请执行以下步骤。

注意 dsquery 实用工具是 Windows Server 2003 Administration Tools Pack 的一部分,而它在 Windows 2000 计算机中是不可用的。

1.

使用域帐户登录到计算机。

2.

从命令行提示符窗口运行以下命令。

dsquery?*?“CN=<hostname>,OU=Domain?Controllers,DC=<yourdomain>,DC=<yourdomain>” –scope base –attr objectguid

您必须用所需的特定域控制器名称替换 <hostname> 变量,并用特定域的域名称替换 <yourdomain> 变量。例如:

dsquery * “CN=DC01,OU=Domain Controllers,DC=contoso,DC=com” –scope base –attr objectguid

该命令将会返回与下列内容相似的输出结果:

Objectguid {57A8AAF4-686E-4128-8712-B6CA89FBF5BC}

3.

注销计算机。

返回页首返回页首

附录 2:示例脚本

本节包含两个 Visual Basic 示例脚本,这两个脚本可用于简化或自定义先前各节中描述的不同过程。

Reqdccert.vbs – 生成域控制器证书申请

Reqdccert.vbs 脚本可使正确 INF 文件的创建过程更加轻松,在向 Windows 2000 或 Windows Server 2003 CA 提交证书申请时,INF 文件是必需的。确定计算机 GUID 的过程以及创建同时包含 GUID 和 DNS 名称的 ASN.1 文件的过程相当复杂,鉴于此,我们用脚本自动生成了 ASN.1 文件。另外,我们还创建了一个包含 certreq –submit 命令的批处理文件,在向 CA 提交证书申请时必须用到此命令。最后,生成了一个验证脚本,当您在 Active Directory 中发布了域控制器证书之后,便可以使用此脚本对域控制器计算机对象中的证书进行验证。

如果您计划向 Windows 2000 或 Windows Server 2003 独立 CA 提交证书申请,请运行不带任何命令行参数的脚本。如果您计划向 Windows Server 2003 企业 CA 提交证书申请,则必须指定用于注册证书的证书模板名称。

注意: 由于脚本需要使用 Windows Server 2003 版本的 certutil 进行内部编码操作,因此强烈建议您在 Windows 2000 域控制器上,将此脚本置于 Windows Server 2003 版本的 certutil 和 certreq.exe 所在的目录中。

Set oArgs = WScript.Arguments 
Set oShell = WScript.CreateObject("WScript.Shell") 
' 
' Parse command line 
' 
if oArgs.Count < 1 then 
    sTemplateName = "DomainController" 
    sType = "E" 
else 
    if ((oArgs(0) = "-?") or (oARgs.Count < 2)) then 
        Wscript.Echo "Usage: reqdccert.vbs [Templatename] [Type]" 
        Wscript.Echo "[Templatename] is the name of a V2 template" 
        Wscript.Echo "[Type]         can be E for Email and A for Authentication certificate" 
        Wscript.Echo "If no option is specified, the DomainController certificate template is used." 
        Wscript.Quit 1 
    else 
        sTemplateName = oArgs(0) 
                sType = oArgs(1) 
    end if 
end if 
Set oFilesystem = CreateObject("Scripting.FileSystemObject") 
Set objSysInfo = CreateObject("ADSystemInfo") 
Set objDC = GetObject("LDAP://" & objSysInfo.ComputerName) 
sGUID = objDC.GUID 
sDNShostname = objDC.DNShostname 
sHostname = objDC.cn 
'############################################################################## 
' 
' Create the ASN.1 file 
' 
'############################################################################## 
Dim aASNsubstring(2, 5) 
Const HEX_DATA_LENGTH = 1 
Const ASCIIDATA = 2 
Const HEXDATA = 3 
Const HEX_BLOB_LENGTH = 4 
Const HEX_TYPE = 5 
aASNsubstring(0, ASCIIDATA) = sDNShostname 
aASNsubstring(0, HEX_TYPE) = "82" 
' 
' Convert DNS name into Hex 
' 
For i = 1 to Len(aASNsubstring(0, ASCIIDATA)) 
    aASNsubstring(0, HEXDATA) = aASNsubstring(0, HEXDATA) & _ 
                                    Hex(Asc(Mid(aASNsubstring(0, ASCIIDATA), i, 1))) 
Next 
aASNsubstring(0, HEX_DATA_LENGTH) = ComputeASN1 (Len(aASNsubstring(0, HEXDATA)) / 2) 
' 
' Build the ASN.1 blob for DNS name 
' 
sASN = aASNsubstring(0, HEX_TYPE) & _ 
       aASNsubstring(0, HEX_DATA_LENGTH) & _ 
       aASNsubstring(0, HEXDATA) 
' 
' Append the GUID as other name 
' 
if (sType = "E") then 
    aASNsubstring(1, HEXDATA) = sGUID 
    aASNsubstring(1, HEX_TYPE) = "A0" 
    aASNsubstring(1, HEX_DATA_LENGTH) = ComputeASN1 (Len(aASNsubstring(1, HEXDATA)) / 2) 
    sASN = sASN & _ 
           "A01F06092B0601040182371901" & _ 
           aASNsubstring(1, HEX_TYPE) & _ 
           "120410" & _ 
           aASNsubstring(1, HEXDATA) 
end if 
' 
' Write the ASN.1 blob into a file 
' 
Set oFile = oFilesystem.CreateTextFile(sHostname & ".asn") 
' 
' Put sequence, total length and ASN1 blob into the file 
' 
oFile.WriteLine "30" & ComputeASN1 (Len(sASN) / 2) & sASN 
oFile.Close 
'  
' Use certutil to convert the hex string into bin 
' 
oShell.Run "certutil -f -decodehex " & sHostname & ".asn " & _  
                                       sHostname & ".bin", 0, True 
'  
' Use certutil to convert the bin into base64 
' 
oShell.Run "certutil -f -encode " & sHostname & ".bin " & _ 
                                    sHostname & ".b64", 0, True 
'############################################################################## 
' 
' Create the INF file 
' 
'############################################################################## 
Set iFile = oFilesystem.OpenTextFile(sHostname & ".b64") 
Set oFile = oFilesystem.CreateTextFile(sHostname & ".inf") 
oFile.WriteLine "[Version]" 
oFile.WriteLine "Signature= " & Chr(34) & "$Windows NT$" & Chr(34) 
oFile.WriteLine "" 
oFile.WriteLine "[NewRequest]" 
oFile.WriteLine "KeySpec = 1" 
oFile.WriteLine "KeyLength = 1024" 
oFile.WriteLine "Exportable = TRUE" 
oFile.WriteLine "MachineKeySet = TRUE" 
oFile.WriteLine "SMIME = FALSE" 
oFile.WriteLine "PrivateKeyArchive = FALSE" 
oFile.WriteLine "UserProtected = FALSE" 
oFile.WriteLine "UseExistingKeySet = FALSE" 
oFile.WriteLine "ProviderName = " & Chr(34) & _ 
                "Microsoft RSA SChannel Cryptographic Provider" & Chr(34) 
oFile.WriteLine "ProviderType = 12" 
oFile.WriteLine "RequestType = PKCS10" 
oFile.WriteLine "KeyUsage = 0xa0" 
oFile.WriteLine "" 
oFile.WriteLine "[EnhancedKeyUsageExtension]" 
oFile.WriteLine "OID=1.3.6.1.5.5.7.3.1" 
oFile.WriteLine "OID=1.3.6.1.5.5.7.3.2" 
oFile.WriteLine ";" 
oFile.WriteLine "; The subject alternative name (SAN) can be included in the INF-file" 
oFile.WriteLine "; for a Windows 2003 CA." 
oFile.WriteLine "; You don't have to specify the SAN when submitting the request." 
oFile.WriteLine ";" 
oFile.WriteLine "[Extensions]" 
iLine = 0 
Do While iFile.AtEndOfStream <> True 
    sLine = iFile.Readline 
    If sLine = "-----END CERTIFICATE-----" then 
        Exit Do 
    end if 
    if sLine <> "-----BEGIN CERTIFICATE-----" then 
        if iLine = 0 then 
            oFile.WriteLine "2.5.29.17=" & sLine 
        else 
            oFile.WriteLine "_continue_=" & sLine 
        end if 
        iLine = iLine + 1 
    end if 
Loop 
oFile.WriteLine "Critical=2.5.29.17" 
oFile.WriteLine ";" 
oFile.WriteLine "; The template name can be included in the INF-file for any CA." 
oFile.WriteLine "; You don't have to specify the template when submitting the request." 
oFile.WriteLine ";" 
oFile.WriteLine ";[RequestAttributes]" 
oFile.WriteLine ";CertificateTemplate=" & sTemplateName 
oFile.Close 
iFile.Close 
'############################################################################## 
' 
' Create the certreq.exe command-line to submit the certificate request 
' 
'############################################################################## 
Set oFile = oFilesystem.CreateTextFile(sHostname & "-req.bat") 
oFile.WriteLine "CERTREQ -attrib " _ 
                 & Chr(34) & "CertificateTemplate:" & sTemplateName _ 
                 & Chr(34) & " " & sHostname & ".req" 
' 
' The GUID structure needs to be reconstructed. The GUID is read 
' as a string like f4aaa8576e6828418712b6ca89fbf5bc however the  
' format that is required for the certreq command looks like 
' 57a8aaf4-686e-4128-8712-b6ca89fbf5bc. The bytes are reordered 
' in the following way: 
' 
'                            11111111112222222222333  
'             Position 12345678901234567890123456789012 
'                      |------|--|--|--|--------------| 
' Original GUID:       f4aaa8576e6828418712b6ca89fbf5bc 
' 
'                            11 1 1111 1112 222222222333                
'             Position 78563412 1290 5634 7890 123456789012                     
'                      |------- |--- |--- |--- |----------| 
' Reformatted GUID:    57a8aaf4-686e-4128-8712-b6ca89fbf5bc 
' 
oFile.WriteLine "REM " 
oFile.WriteLine "REM !!! Only valid for Windows 2003 or later versions !!!" 
oFile.WriteLine "REM If you do not specify certificate extensions in the *.INF file" 
oFile.WriteLine "REM they can be specified here like the following example" 
oFile.WriteLine "REM " 
oFile.WriteLine "REM CERTREQ -submit -attrib " _ 
                 & Chr(34) & "CertificateTemplate:" & sTemplateName _ 
                 & "\n" _ 
                 & "SAN:guid=" _ 
                 & Mid(sGUID, 7, 2) _ 
                 & Mid(sGUID, 5, 2) _ 
                 & Mid(sGUID, 3, 2) _ 
                 & Mid(sGUID, 1, 2) & "-" _ 
                 & Mid(sGUID, 11, 2) _ 
                 & Mid(sGUID, 9, 2) & "-" _ 
                 & Mid(sGUID, 15, 2) _ 
                 & Mid(sGUID, 13, 2) & "-" _ 
                 & Mid(sGUID, 17, 4) & "-" _ 
                 & Mid(sGUID, 21, 12) _ 
                 & "&DNS=" & sDNShostname & Chr(34) & " " & sHostname & ".req" 
oFile.Close 
'############################################################################## 
' 
' Create the certificate verification script 
' 
'############################################################################## 
Set oFile = oFilesystem.CreateTextFile(sHostname & "-vfy.bat") 
oFile.WriteLine "certutil -viewstore " & Chr(34) & objDC.distinguishedname & _ 
                "?usercertificate" & chr(34) 
oFile.Close 
'############################################################################## 
' 
' Compute the ASN1 string 
' 
'############################################################################## 
Function ComputeASN1 (iStrLen) 
    If Len(Hex(iStrLen)) Mod 2 = 0 then 
        sLength = Hex(iStrLen) 
    else 
        sLength = "0" & Hex(iStrLen) 
    end if 
    if iStrLen > 127 then 
        ComputeASN1 = Hex (128 + (Len(sLength) / 2)) & sLength 
    else 
        ComputeASN1 = sLength 
    End If 
End Function

FixDCtemplate.vbs

对于任何需要接受使用者名称和使用者备用名称作为证书申请一部分的证书模板,fixDCtemplate.vbs 脚本可简化其所需的更改。要更改证书模板对象中的 msPKI-Certificate-Name-Flag,需要使用 Active Directory Service Interface (ADSI)。

MsPKI-Certificate-Name-Flag 属性实际上是一个位字段,其中第一位用于确定模板是否接受使用者名称和使用者备用名称。在更改位之前,脚本会先确定是否已设置了位。

Set oArgs = WScript.Arguments 
' 
' Parse command line 
' 
if oArgs.Count <> 1 then 
    Wscript.Echo "fixdctemplate {templatename}" 
    WScript.Quit 1 
end if 
Set objRoot = GetObject("LDAP://rootDSE") 
Set objTemplate = GetObject("LDAP://CN=" & oArgs(0) & _ 
                               ",CN=Certificate Templates," & _ 
                               "CN=Public Key Services,CN=Services," & _ 
                               objRoot.Get("configurationNamingContext")) 
iNameFlag = objTemplate.Get("msPKI-Certificate-Name-Flag") 
if iNameFlag = 1 then 
    Wscript.Echo "Flag is already set" 
else 
    objTemplate.Put("msPKI-Certificate-Name-Flag"), 1     
    objTemplate.SetInfo 
    Wscript.Echo "Flag was set" 
end if
返回页首返回页首

附录 3:Certreq.exe 语法

Certreq.exe 是包含在 Windows 2000 Server、Windows XP、Windows Server 2003 以及 Windows Server 2003 Administration Tools Pack 中的一个命令行工具。此工具在 Windows XP 和 Windows Server 2003 中的可用版本不同于 Windows 2000 Server 中所包括的版本。在使用 certreq.exe 时,必须明确区分这两个版本。

您可以使用 certreq.exe 执行以下任务。

创建新的证书申请。其中包括生成对应于证书申请的密钥材料。

将策略应用于证书申请。这适用于需要各种不同约束的 CA 证书。鉴于在 CA 创建的证书申请中不能包括证书策略,因此您必须在 CA 证书申请中明确应用策略。

向证书颁发机构提交证书申请。此功能还可在远程证书颁发机构中使用,因此您可以借助网络向远程 CA 提交申请。

从 CA 检索证书。您可以根据证书申请 ID,从 CA 检索任何证书,并将检索到的证书保存为文件。

接受(和安装)证书或响应。此命令旨在接受证书或包含证书的响应。您在计算机中用 certreq.exe 创建了证书申请后,所创建的申请将一直处于挂起状态,直至您安装了对应该申请的证书为止。

签署证书申请。如果证书模板管理员将证书注册代理签名数量设置为大于 0 的值,那么您就可以使用此选项来签署证书申请。

Windows 2000 版本的 certreq.exe 只能提交证书申请和检索已颁发的证书。其他所有选项都需要 Windows XP 或 Windows Server 2003 所附带的 certreq.exe 版本。有关命令行语法的更多信息,请运行具有带有以下参数的 certreq.exe,查看所有的可用语法和参数信息。

Certreq.exe -v -?

创建证书申请

带有 -new 参数的 certreg.exe 用于构建新的证书申请。Certreq.exe 使用 INF 文件作为输入选项,定义证书申请的参数。在根据 INF 文件构建证书申请时,还会生成密钥材料。证书申请过程可以分为以下几个步骤。

读取 INF 文件。

基于 INF 文件中的信息创建私钥和公钥,并根据需要将私钥存储在用户或机器配置文件的密钥存储区中。

基于 INF 文件中的信息创建证书申请,并将申请存储成 Base64 编码的文件,或者如果选择了 –binary 选项,则存储成二进制文件。

Certreq.exe INF 文件结构

由于 INF 文件允许指定丰富的参数集和选项,因此很难定义一个可供管理员在所有场合下应用的默认模板。因此,本节介绍了允许您根据自己的特定需要创建 INF 文件的所有选项。

下列关键字用于说明 INF 文件的结构。

是 INF 文件中的一个区域,其中包含有逻辑键组。节一般出现在 INF 文件的括号中。

是等号左侧的参数。

是等号右侧的参数。

例如,最小的 INF 文件看起来与以下内容相似:

[NewRequest] ; At least one value must be set in this section Subject = "CN=W2K3-BO-DC.contoso2.com"

注意: 您可以在行前放置一个分号 (;),为该行添加注释。

下面是一些可添加到 INF 文件中的节。

[Version]

此节为可选节,在 INF 文件中不是必需的。如果包含此节,就必须包含 Signature 键。

Signature

Signature 键必须等于固定字符串“$Windows NT$”。

[NewRequest]

此节对于 INF 文件是必需的,其作用相当于新证书申请的模板。如果缺少此节,就会显示以下错误消息。

“找不到 INF 文件 0xe0000102 (INF:-536870654)”

此节至少需要一个键和一个键值。如果此节为空,不包含任何键,就会显示以下错误消息。

“函数不正确。0x1 (WIN32:1)”

EncipherOnly

语法

EncipherOnly={Boolean}

TRUE 或 FALSE

默认值

FALSE

示例

EncipherOnly = TRUE

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

可以(通过密钥用法扩展)

此参数会影响公钥-私钥对的功能。如果此值设置为 TRUE,那么密钥就只能用于“encipherment”(加密)。如果此值设置为 FALSE,那么密钥就可用于“encipherment”(加密)和其他用途。此参数仅指 CryptoAPI 中的密钥类型,它只与颁发的 X.509 证书中可能包括的密钥使用扩展有间接关系。证书注册控制的默认值设置为 FALSE。此设置仅影响 AT_KEYEXCHANGE 密钥类型,进而会限制密钥加密和/或数据加密的密钥用法。数字签名和非拒绝密钥用法将被禁用。

Exportable

语法

Exportable = {Boolean}

TRUE 或 FALSE

默认值

FALSE

示例

Exportable = TRUE

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

当“UseExistingKeySet”键设置为 TRUE 时,可以忽略此参数,因为您只能在创建新密钥时设置可导出的标记。您可以更改现有密钥的此标记。如果将此属性设置为 TRUE,就可以用证书导出私钥。为了确保高级别的安全性,一般情况下不能导出私钥;但是,在有些情况下,如果多台计算机或多个用户必须共享相同的私钥,则可能需要将私钥设置为可导出的私钥。例如,运行 SSL 并用 ISA (Internet Security and Acceleration) 发布到 Internet 上的 Web 服务器需要具有可导出密钥的证书,因为证书和密钥必须同时安装在 Web 服务器和 ISA 服务器上。还有,如果需要管理和备份密钥,为了提供此方面的功能这些密钥必须是可导出的。

如果使用 Windows Server 2003 企业 CA,那么此设置将与模板配置息息相关。证书模板管理员可以明确定义私钥是否可以导出。

注意: 对于通过 certreq.exe -new 生成的密钥,模板的可导出设置不会影响其导出属性。

KeyContainer

语法

KeyContainer = {Key_containerName}

随机字符串值 (GUID)

默认值

示例

KeyContainer = {C347BD28-7F69-4090-AA16-BC58CF4D749C}

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

建议您不要为生成新密钥材料的新申请设置此参数。密钥容器是由系统自动生成和维护的。

对于使用现有密钥材料的申请,此值可设置为现有密钥的密钥容器名称。

使用 certutil –key 命令显示机器上下文中的可用密钥容器列表。

对于当前用户上下文,可使用 certutil –key –user 命令。

如果您需要查找特定证书的密钥容器,请为机器证书使用 certutil –store my 命令。

要在当前用户的证书存储区中查找特定证书的密钥容器,请使用 certutil –store –user my 命令。

如果“UseExistingKeySet”键设置为 TRUE,就必须在 INF 文件或续订证书中明确设置密钥容器。

KeyLength

语法

KeyLength = {integer}

密码服务提供商所支持的任何有效密钥长度

默认值

1024 [取决于证书服务提供商 (CSP)]

示例

KeyLength=2048

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

密钥长度用于定义公钥和私钥的长度。密钥长度会影响证书的安全级别。密钥越长,所能提供的安全级别就更高;但是,有些应用程序可能对密钥长度有一定的限制。

KeySpec

语法

KeySpec = {integer}

AT_EXCHANGE:1

AT_SIGNATURE:2

默认值

2

示例

KeySpec=1

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

KeySpec 用于确定密钥是否可用于签名、Exchange(加密),或同时用于这两者。如果将 KeySpec 的值设置为 2,就可以忽略 EncipherOnly 键。

KeyUsage

语法

KeyUsage = {hexadecimal_value}

CERT_DIGITAL_SIGNATURE_KEY_USAGE 0x80

CERT_NON_REPUDIATION_KEY_USAGE 0x40

CERT_KEY_ENCIPHERMENT_KEY_USAGE 0x20

CERT_DATA_ENCIPHERMENT_KEY_USAGE 0x10

CERT_KEY_AGREEMENT_KEY_USAGE 0x08

CERT_KEY_CERT_SIGN_KEY_USAGE 0x04

CERT_OFFLINE_CRL_SIGN_KEY_USAGE 0x02

CERT_CRL_SIGN_KEY_USAGE 0x02

CERT_ENCIPHER_ONLY_KEY_USAGE 0x01

默认值

对于 AT_SIGNATURE 为 0xC0(默认)

对于 AT_KEYEXCHANGE,EncipherOnly = TRUE:?0x30

对于 AT_KEYEXCHANGE,EncipherOnly = FALSE:?0xf0

示例

KeyUsage=0xa0

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

可以

密钥用法用于定义证书密钥的应用场合。此值为位字段,由“Windows 平台软件开发套件”(SDK) 中定义的密钥用法标志组成。(请参见所包括的文件 wincrypt.h。)在根据预期的应用程序用法为证书申请定义正确的密钥用法时,要格外谨慎。

注意:密钥用法扩展与扩展的密钥用法扩展之间具有间接的依赖关系。例如,如果您指定“文件系统加密”作为扩展的密钥用法,则应当指定“密钥加密”密钥用法。

要合并多个密钥用法,可以执行十六进制算法,对单个密钥用法的值进行汇总。默认的密钥用法被设置为“数字签名”(0x80) 和“非拒绝”(0x40)。0x80 和 0x40 的十六进制和为 0xC0。

如果证书申请要提交给独立 CA,则密钥用法参数将十分有用。只有企业 CA 具有由证书模板预定义的证书密钥用法。密钥用法扩展的默认设置为关键的。

MachineKeySet

语法

MachineKeySet = {Boolean}

TRUE 或 FALSE

默认值

FALSE

示例

MachineKeySet = TRUE

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

在需要创建机器拥有(而非用户拥有)的证书时,此密钥十分重要。所生成的密钥材料将在创建申请的安全主体(用户或计算机帐户)的安全上下文中进行维护。在管理员代表计算机创建证书申请时,密钥材料必须在机器安全上下文而非管理员安全上下文中创建。否则,机器将有可能无法访问其私钥,因为私钥可能在管理员安全上下文中。

如果您要为域控制器、Web 服务器或其他运行在机器安全上下文中的服务创建申请,就必须将此密钥设置为 TRUE。

PrivateKeyArchive

语法

PrivateKeyArchive = {Boolean}

TRUE 或 FALSE

默认值

FALSE

示例

PrivateKeyArchive = TRUE

支持的 CA 类型

Windows Server 2003

能否在挂起申请中操作

不可以

PrivateKeyArchive 设置只有在相应的 RequestType 设置为“CMC”时才起作用,因为只有以 CMS (CMC) 申请格式发布的“证书管理消息”才能安全地将申请者的私钥传递给归档密钥的 CA。只有 Windows Server 2003 企业 CA 支持私钥归档。在归档过程中,Windows Server 2003 企业 CA 必须联机,且必须具有可从 CA 加密证书直接检索的权限。

ProviderName

语法

ProviderName = {CSP_stringname}

证书服务提供商的说明性名称

默认值

Microsoft Strong Cryptographic Provider

示例

ProviderName="Microsoft RSA SChannel Cryptographic Provider"

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

提供商的名称即为 CSP 的显示名称。如果您不知道所用 CSP 提供商的名称,可以从命令行运行 certutil –csplist。此命令将显示本地系统中所有可用 CSP 的名称。

ProviderType

语法

ProviderType = {integer}

描述提供商类型的数字

默认值

12

示例

ProviderType=13

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

提供商类型用于根据特定的算法功能(如“RSA Full”)选择特定的提供商,。如果您不知道所用 CSP 提供商的类型,可以从命令行提示符窗口运行 certutil –csplist。此命令将显示本地系统上所有可用 CSP 的提供商类型。

RenewalCert

语法

RenewalCert={CertificateHash}

创建证书申请的计算机上任何可用证书的证书哈希

默认值

不适用

示例

RenewalCert=4EDF274BD2919C6E9EC6A522F0F3B153E9B1582D(如果在十六进制值对间使用空格,则必须使用双引号)

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

如果需要续订生成证书申请系统中的现有证书,必须指定证书哈希作为此键的值。如果您不知道证书哈希,则使用“证书 MMC 管理单元”,查看应续订的证书。打开证书属性,可以看到证书的“缩略图”属性。证书续订的申请格式可以是 PKCS#7,也可以是 CMC。

注意:您只能续订时间有效的证书。过期证书不能续订,且必须用新证书将其替换。

Requestername

语法

Requestername= Active Directory 中的 samAccountName

?

默认值

不适用

示例

Requestername = "DOMAINNAME\username"

支持的 CA 类型

Windows 2000(仅限于 PKCS#7 申请类型)

Windows Server 2003

能否在挂起申请中操作

不可以

如果 RequestType 被设置为 PKCS7 或 CMC,就可以为证书申请指定申请者的名称。如果 RequestType 被设置为 PKCS10,即可忽略此密钥。Requestername 只能够作为申请的一部分进行设置。您不能在挂起的申请中操作 Requestername

RequestType

证书

RequestType={字符串值}

CMC

PKCS10

PKCS10-

PKCS7

默认值

PKCS10

示例

RequestType = CMC

支持的 CA 类型

Windows 2000(除 CMC 类型之外的所有申请类型)

Windows Server 2003

能否在挂起申请中操作

不可以

RequestType 用于确定生成和发送证书申请所用的标准。

Silent

语法

Silent={Boolean}

TRUE 或 FALSE

默认值

FALSE

示例

Silent = TRUE

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

在默认情况下,此选项允许 CSP 访问交互式用户桌面和申请信息,如用户的智能卡 PIN。如果将此密钥设置为 TRUE,CSP 将不能与桌面进行交互,且其面向用户的用户界面也将被阻挡,而无法显示。

SMIME

语法

SMIME = {Boolean}

TRUE | FALSE

默认值

False(当 KeySpec = AT_SIGNATURE 时)

示例

SMIME = TRUE

支持的 CA 类型

Windows 2000(如果在注册表中将策略模块配置为忽略申请中的扩展)

Windows Server 2003

能否在挂起申请中操作

可以

如果此参数被设置为 TRUE,就会在申请中添加带有 OID 值 1.2.840.113549.1.9.15 的扩展。扩展最多可以包含 4 个 OID,具体包含几个要依 CSP 的容量而定,CSP 容量是指“安全多用途 Internet 邮件扩展”(S/MIME) 应用程序(如 Outlook)可能用到的对称式加密算法。

在发送 S/MIME 加密电子邮件时,发件人的计算机并不能准确获悉收件人所支持的加密算法。因此,为了确保较高级别的互操作性,我们默认选择最弱的加密算法。现在,大多数计算机所支持的加密算法都可以处理超过 40 位的超强密钥。为了给发件人一个 S/MIME 消息提示,告知其收件人所支持的加密算法,在证书中插入了所支持对称算法的标识符。此外,还可通过注册表对 Outlook 进行配置,使其一直使用默认的加密算法。更多信息,请参见以下站点处的知识库文章:
http://support.microsoft.com/?id=307472

Outlook XP SP2 或更新版本的 Outlook 均支持此功能。

如果 CA 管理员已向 CA 配置参数“DisableExtensionList”中添加了 S/MIME 功能的 OID,CA 便会在申请中忽略 S/MIME 功能。有关如何向“DisabledExtensionList”添加条目的更多信息,请参见以下站点处的 Windows Server 2003 PKI 操作指南:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03pkog.mspx

Subject

语法

Subject={字符串}

随机字符串值

默认值

不适用

示例

Subject=”CN=computer1.contoso.com” Subject=”CN=John Smith,CN=Users,DC=Contoso,DC=com” x

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

可以

许多应用程序都依赖于证书中的使用者信息。因此,强烈建议您为此键指定一个值。如果未在此处设置使用者的值,建议您将使用者名称包括在使用者备用名称证书扩展中。

UseExistingKeySet

语法

UseExistingKeySet={Boolean}

TRUE 或 FALSE

默认值

FALSE

示例

UseExistingKeySet=TRUE

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

此参数用于指定在构建证书申请的过程中是否使用现有密钥对。如果此密钥被设置为 TRUE,则还必须指定 RenewalCert 键值或 KeyContainer 名称。您不必设置 Exportable 键,因为您不能更改现有密钥的属性。在这种情况下,构建证书申请时不会生成密钥材料。

UserProtected

语法

UserProtected={Boolean}

TRUE 或 FALSE

默认值

FALSE

示例

UserProtected=TRUE

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

不可以

如果此密钥被设置为 TRUE,则在证书申请构建过程中生成密钥时,会显示一个 CryptoAPI 密码窗口。您可以在窗口中使用密码来保护密钥,也可以在应用程序使用密钥时仅显示一个窗口。使用密码对密钥加以保护之后,每次访问密钥时都必须输入此密码。有关强私钥保护的更多信息,请参见
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/autoenro.mspx 

[EnhancedKeyUsageExtension]

增强的密钥用法扩展决定了证书的用途。要查看 CA 所支持 OID 的列表,请在命令行提示符窗口中运行以下命令。

certutil –oid [OID string value]

注意: 您可以向 CA 配置添加自定义的 OID。因此,您可以根据需要扩展 Windows Server 2003 CA 所提供的默认 OID 列表。

有关 Microsoft PKI 所支持的对象标识符列表,请参见以下站点处的知识库文章“与 Microsoft 加密相关的对象 ID”:
http://support.microsoft.com/?id=287547

OID

语法

OID={OID_String}

任何有效的 OID

默认值

不适用

示例

OID = 1.3.6.1.5.5.7.3.1

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

可以

OID 是一个指定值,可以添加到扩展密钥用法中。要指定多个 OID,为每个所需的 OID 添加一个新的数据行即可。例如:

OID = 1.3.6.1.5.5.7.3.1 OID = 1.3.6.1.5.5.7.3.2
[Extensions]

如果申请的初始状态为挂起,就不必在此节中指定扩展,您可以在向 Windows Server 2003 CA 或 Windows 2000 CA 提交证书申请时设置扩展。

{OID}

语法

{OID} = {Base64Text}

证书中出现的任何有效 OID

默认值

不适用

示例

2.5.29.17=MDmCFlcySy1CTy1EQy5jb25 _continue_=0b3NvMi5jb22gHwYJKwYBB _continue_=AGCNxkBoBIEENKgYHzc _continue_=F4dJmg+HRCPkkQ0=

支持的 CA 类型

Windows 2000

Windows Server 2003

能否在挂起申请中操作

可以

您可以通过此参数在申请中添加证书扩展。此值必须为 Base64 编码的字符串。要将字符串拆分成多行,请使用 _continue_ 关键字。

Critical

语法

Critical = {coma-separated OIDList}

证书 [Extensions] 节中出现的任何有效 OID

默认值

不适用

示例值

Critical = 2.5.29.17,2.5.29.15

能否在挂起申请中操作

可以

此参数代表特定证书扩展(扩展被设置为关键的)的 OID 列表。在证书申请处于挂起状态时,您还可以使用 certutil –setextension 命令将证书扩展设置为关键的。更多信息,请参见“certutil -setextension”一节。

[RequestAttributes]

此节中的所有键都可作为 certreq -submit -attrib 命令的一部分指定。例如,您可以在命令行提示符窗口中使用以下命令,而不需要在 INF 指令文件中指定 CertificateTemplate。

certreq?-submit?-attrib?"CertificateTemplate:Domaincontroller"?dcname.req
CertificateTemplate

语法

CertificateTemplate = {Templatename}

任何有效的证书模板名称

默认值

不适用

示例值

Critical = "DomainController"

能否在挂起申请中操作

可以

此键值帮助 CA 确定处理证书申请过程中应当使用的证书模板。此名称必须指定为证书模板的公用名或模板的 OID,而不能是模板的显示名称。您可以使用下面的命令来确定有效证书模板公用名称的列表。

certutil -templates
SAN

语法

SAN = "{tag}={value}&{tag}={value}]..."

有效 subjectalternatename2 扩展标记的列表。

email、upn、dns、guid、url、ipaddress、oid

另外,还可以指定任何有效的 OID。

默认值

不适用

示例值

参见下面的示例值;始终在值的前后打上双引号

能否操作挂起申请

可以

使用者备用名称可以用不同的方法指定。服务主体名称 (SPN) 被指定为用户主体名称 (UPN) 值。此值默认为字符串类型,但可以在分节符“{}”中具有标记前缀,该标记前缀可明确确定值的数据类型,如下表所示。

SAN 字符串 
2.5.29.17={octet}MBmCF1cySzMtQk8tREMuY29udG9zbzIuY29t

ASN.1 字符串与一个或多个编码扩展一起插入到使用者备用名称中。

Octet 是一种针对 Base64 字符串进行二进制格式编码的包装程序。

1.2.3.4={utf8}SomeReadableText

ASN.1 字符串与一个或多个编码扩展一起插入到使用者备用名称中。

该值是用 UTF8 包装程序编码的字符串。

2.5.29.17={asn}=3019821757...

ASN.1 字符串与一个或多个编码扩展一起插入到使用者备用名称中。

email=John.Smith@contoso.com

用户的电子邮件地址被插入到使用者备用名称中。

dns=”w2k3bodc.contoso.com”

DNS 名称被设置为计算机的 FQDN。

dn="CN=W2K3BODC,OU=Domain?Controllers,DC=contoso,DC=com"

可分辨名称被设置为域控制器的 DN。

url="http://www.contoso.com/default.html"

URL 被设置为 http URL。

ipaddress=172.134.10.134

IP 被插入到使用者备用名称中。

oid=2.5.29.17

给定 OID 被插入到使用者备用名称中。

upn=John.Smith@contoso.com

UPN 名称代表用户。

guid=f7c3ac41-b8ce-4fb4-aa58-3d1dc0e36b39

GUID 被插入到使用者备用名称中。

多个标记和值必须用和符号 (&) 连接。例如,要设置 UPN 和 GUID,您必须在命令行提示符窗口中设置以下使用者备用名称。

-attrib “SAN:upn=John.Smith@contoso.com&guid=f7c3ac41-b8ce-4fb4-aa58-3d1dc0e36b39”

如果您想在 INF 文件中插入使用者备用名称,其语法看起来与下面的语法相类似。

SAN="upn=John.Smith@contoso.com&guid=f7c3ac41-b8ce-4fb4-aa58-3d1dc0e36b39"

-policy

有关此选项的详细说明和示例,请参见以下站点处的“使用 Windows Server 2003 规划和实施交叉证书和合格的部属”:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03qswp.mspx

-submit

这是 certreq.exe 的默认选项,如果没有在命令行提示符窗口中明确指定此选项,certreq.exe 就会尝试向 CA 提交证书申请。使用 –submit 选项时,您必须指定一个证书申请文件。如果忽略此参数,会显示一个通用的“打开文件”窗口,提示您选择适当的证书申请文件。有关此选项可用命令行参数的更多信息,请参见“Certreq – 提交失败,错误 0x80094800”或从命令行键入 certreq -submit -?。

还可以将 INF 说明文件中 RequestAttributes 节的证书属性指定为 Windows 2000 Server 和 Windows Server 2003 的命令行参数。有关可与 -submit 参数一起使用的有效使用者备用标记列表,请参见 SAN。切记属性类型之间要用“\n”隔开。而每个具体的使用者备用名称属性值之间则要用“和”符号 (&) 隔开。

下面是 certreq.exe 命令的示例。

certreq -attrib "SAN:email=John.Smith@contoso.com" -submit myreq.req 
certreq -submit -attrib "CertificateTemplate:Domaincontroller\nSAN:DNS=w2k3bodc.contoso.com" dcname.req dcname.cer dcname.p7b 
certreq -submit -attrib "SAN:UPN=admin@contoso.com&email=foo@bar.com&guid=f7c3ac41-b8ce-4fb4-aa58-3d1dc0e36b39"

-retrieve

此选项允许您从 CA 检索已颁发的证书。证书所有者或提交者可以从 Windows 2000 或 2003 CA 检索其证书。证书管理员可以从 Windows Server 2003 CA 检索所有的证书。这不会构成安全问题,因为通过 CA 数据库可用的证书仅包含一些公共信息,而只有最初的申请者才能检索已颁发的证书。

-accept

证书注册过程中最后的也是最重要的一步便是接受证书,或对证书颁发和证书检索(从 CA 检索)做出响应。这些应用程序中内置的自动功能可以接收自动注册或通过 MMC 管理单元申请的证书。但是,手动证书申请(如用 certreq.exe 提交的证书)则必须手动接受或手动安装。Certreq.exe 的 -accept 参数可在之前生成的私钥和已颁发的证书之间建立连接,并从申请证书的系统中移除挂起的证书申请。在 CA 中归档私钥时,需要接受 CMC 完全响应。

-sign

如果模板管理员将模板配置为证书申请需要一个或多个签名,就必须在申请中添加这些签名,这样 CA 才能正确处理您的证书申请。默认的“证书服务”Web 注册页只能向证书申请添加一个签名,尤其是在使用“注册代理”证书代表另一个用户申请智能卡证书时更是如此。这时如果需要多个签名,就必须从命令行用 certreq.exe –sign 在证书申请中添加这些签名,每次添加一个签名。

返回页首返回页首

附录 4:Certutil -setextension

此选项允许管理员操作 CA 中的挂起申请。在有些情况下,不可能在证书申请中指定每个可能的证书扩展。例如,如果用“证书颁发机构 MMC 管理单元”向 CA 提交用户证书申请,那么在注册过程中就不允许有其他的信息。

但是,要将扩展应用于挂起的证书,就必须手动创建 ASN.1 编码的扩展。在您构建完所需的 ASN.1 二进制大对象 (BLOB) 信息后,便可以向挂起的证书申请中添加扩展了。将数据编码成 ASN.1 的数据并不是很简单的,而且您必须要了解 certutil.exe 所用宏语言的基本概念。您可以查找一个带有所需扩展的现有申请或证书,然后再使用 certutil -v -dump 将扩展显示为 hex-dump,这要相对容易得多。

有关 ASN.1 编码的更多信息,请参见附录 5:ASN.1 文件结构。

Ssetextension 选项与 certreq.exe 所用 INF 文件中的 [Extensions] 节相似。这意味着可以为这些独特的 OID 在证书模板上设置关键标志,还可以使用命令行选项为这些 OID 设置特定值。

注意: 使用企业 CA,模板设置一般会覆盖手动设置的证书扩展冲突。但这仅适用于通过模板明确设置的扩展。

命令行语法看起来与下面的示例类似。

certutil.exe –setextension <RequestID> <ExtensionName> Flags {Long|Date|String|@InFile}
选项描述

Request-ID

挂起申请的 ID。此 ID 可由“证书颁发机构 MMC 管理单元”来确定。

ExtensionName

应当修改的扩展的 OID。如果您不能确定适合的 OID,则可以转储一个现有证书,并从中查找 OID。

Flags

用于将证书扩展设置为关键。flag = 0 表示扩展为非关键;flag = 1 表示扩展为关键。

{Long | Date | String | @InFile}

仅应用 @InFile 选项。其他所有参数都不要使用。@InFile 可以是 Base64 编码的,也可以是十六进制格式的文件。如果文件内容可以转换为 Base64 或十六进制,则应使用十六进制。要强制使用 Base64 转换,应使用“----- BEGIN -----”和“----- END -----”作为标头。文件内容取决于所应操控的扩展。

下面的示例说明了如何使用 certutil -setextension 命令将 CA 上挂起证书的密钥用法设置为关键,并将证书用法限制为证书和证书吊销列表 (CRL) 的签署。

echo 03 02 01 06>ku.txt certutil.exe -setextension <Request-ID> 2.5.29.15 1 @ku.txt
返回页首返回页首

附录 5:ASN.1 文件结构

编译 ASN.1 BLOB 需要了解与 ASN.1 编码有关的高级知识。如果您是在开发自己的应用程序,那么我们强烈建议您使用编码功能(如 CCertEncodeAltName)创建 ASN.1 BLOB。请参见
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/icertencodealtname.asp

手动开发和解析这种 ASN.1 数据结构是很耗时的,而且由于数据编码规则的整体复杂性,很容易出现错误。

下面是一个示例 ASN.1 BLOB,其作用是将服务器 GUID 及其 DNS 名称添加到证书的使用者备用名称扩展中。两个框中的第一行是实际的 ASN.1 BLOB;后边的几行按列解释了 BLOB 中的字段所实际代表的意义。请注意,完整的 ASN.1 BLOB 是下面的序列。

30468223636B696E64657230312E6575726F70652E636F72702E6D6963726F736F66742E636F6D A01F06092B0601040182371901A012041063303530353634346161313364326338

下框更详细地解释了 ASN.1 文件结构。

30468223636B696E64657230312E6575726F70652E636F72702E6D6963726F736F66742E636F6D 
Sequence 
  Total length of ASN.1 string 
    ContextSpecificPrimitiveType 
     Generalname see http://www.ietf.org/rfc/rfc2459.txt for a list of General 
      Lenth of DNS name -----------------------------------------------------| 
        DNS name ------------------------------------------------------------| 
A01F06092B0601040182371901A012041063303530353634346161313364326338 
ContextSpecificConstructedType 
 Generalname see http://www.ietf.org/rfc/rfc2459.txt 
  Length of othername -------------------------------------------| 
    Other name OID-------| 
                          ContextSpecificConstructedType 
                           Generalname see http://www.ietf.org/rfc/rfc2459.txt 
                            Length of datatype and othername 
                              Other name datatype see 
                              http://asn1.elibel.tm.fr/en/resources/tags.htm 
                                Length of othername 
                                  GUID --------------------------|

有关 ASN.1 编码的更多信息,请参见以下站点处的 MSDN 文章:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/security/security/example_c_program_converting_names_from_certificates_to_asn1_and_back.asp

返回页首返回页首

附录 6:用十六进制、二进制和 Base64 编码和解码

在许多情况下,要插入证书或证书申请中的数据必须从人们可识别的格式转化为计算机可识别的格式。在使用 X.509 证书时,最需要了解的格式是十六进制、二进制和 Base64。由于手动执行数据转换十分耗时,因此我们使用 certutil.exe 来完成此功能。

正如前面所提到的,certutil.exe 有两个版本。在下表中,V1 表示 Windows 2000 版本,V2 表示 Windows Server 2003 版本。

到十六进制到二进制到 Base64

十六进制

不适用

V1:-decodehex

V2:-decodehex

不适用

二进制

V1:不适用

V2:-encodehex

不适用

V1:-encode

V2:-encode

Base64

不适用

V1:-decode

V2:-decode

不适用

此表说明,您不能够将数据直接从 Base64 转成十六进制,反之亦然。不过,您可以将二进制作为中间格式,执行这两种类型之间的转换。“附录 2:示例脚本”中的 reqdccert.vbs 利用了 certutil.exe 的转换功能,在不需要编程知识的情况下,便执行了管理员所要进行的工作。例如,要将 ASN.1 BLOB 数据转换为 Base64 格式(certreg.exe INF 说明文件需要使用这种格式)的数据,脚本使用 certutil.exe 自动执行下列命令。

certutil –decodehex <dcname>.asn <dcname>.bin certutil –encode <dcname>.bin <dcname>.b64
返回页首返回页首

总结

正如本白皮书所详细论述的,Windows Server 2003 提供了一个强大且灵活的平台,可以支持最为复杂或需求最广泛的部署环境。虽然本白皮书的重点在于演示如何在断开连接的情况下或在分公司部署中支持脱机域控制器 X.509 证书注册的过程,但其中的过程却可以直接应用于所有复杂的应用程序环境。管理员可以应用这里提供的概念,用于支持任何类型的网络或基础结构服务。其中包括目录服务器 (AD/AM)、radius 服务器 (IAS)、web 服务器 (IIS),以及其他需要 X.509 证书注册或供应来提供或启用安全协议、消息传递或应用程序服务的独立应用程序。

返回页首返回页首

相关链接

更多信息,请参见下列参考资料:

如何在 Windows 2000 域控制器中配置安全 LDAP 及 SMTP 复制的数字证书,位于:
http://www.microsoft.com/technet/security/guidance/secmod154.mspx

第三方 CA (Q291010) 的域控制器证书要求,位于:
http://support.microsoft.com/default.aspx?scid=kb;en-us;291010

如何用第三方证书颁发机构通过 SSL 启用 LDAP,位于:
http://support.microsoft.com/default.aspx?scid=kb;en-us;321051

Windows Server 2003 中的证书自动注册,位于:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/autoenro.mspx

实施 Microsoft Windows Server 2003 公钥基础结构的最佳实践,位于:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws3pkibp.mspx

使用 Windows Server 2003 规划和实施交叉证书和合格的部属,位于:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03qswp.mspx

在 Windows Server 2003 中实施和管理证书模板,位于:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03crtm.mspx

Windows Server 2003 中的密钥归档和管理,位于:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/kyacws03.mspx

Windows Server 2003 PKI 操作指南,位于:
http://www.microsoft.com/technet/prodtechnol/windowsserver2003/technologies/security/ws03pkog.mspx

Microsoft 系统体系结构 (MSA) 证书服务企业设计,位于:
http://www.microsoft.com/resources/documentation/msa/2/all/solution/en-us/msa20rak/vmhtm122.mspx

有关 Windows Server 2003 的最新信息,请参见 Windows Server 2003 Web 站点,位于:http://www.microsoft.com/windowsserver2003


返回页首返回页首