certreq 命令可用于从证书颁发机构 (CA) 请求证书、从 CA 检索对以前某个请求的响应、从 .inf 文件创建新的请求、接受和安装对请求的响应、从现有的 CA 证书或请求构造交叉证书或合格的从属请求,以及签署交叉证书或合格的从属请求。
Important
早期版本的 certreq 命令可能不会提供此处所述的所有选项。 若要查看基于特定版本的 certreq 所支持的选项,请运行命令行帮助选项 certreq -v -?。
在 CEP/CES 环境中,certreq 命令不支持基于密钥证明模板创建新的证书请求。
Warning
本主题的内容基于 Windows Server 的默认设置;例如,将密钥长度设置为 2048,选择 Microsoft 软件密钥存储提供程序作为 CSP,并使用安全哈希算法 1 (SHA1)。 根据公司安全策略的要求评估这些选择。
Syntax
certreq [-submit] [options] [requestfilein [certfileout [certchainfileout [fullresponsefileOut]]]]
certreq -retrieve [options] requestid [certfileout [certchainfileout [fullresponsefileOut]]]
certreq -new [options] [policyfilein [requestfileout]]
certreq -accept [options] [certchainfilein | fullresponsefilein | certfilein]
certreq -sign [options] [requestfilein [requestfileout]]
certreq -enroll [options] templatename
certreq -enroll -cert certId [options] renew [reusekeys]
Parameters
| Parameter | Description | 
|---|---|
| -submit | 向证书颁发机构提交请求。 | 
| -取回 <requestid> | 从证书颁发机构检索对上一个请求的响应。 | 
| -new | 从 .inf 文件创建新请求。 | 
| -accept | 接受和安装对证书请求的响应。 | 
| -policy | 设置请求的策略。 | 
| -sign | 签署交叉证书或合格的从属请求。 | 
| -enroll | 注册或续订证书。 | 
| -? | 显示 certreq 语法、选项和说明的列表。 | 
| <parameter>-? | 显示指定参数的帮助。 | 
| -v -? | 显示 certreq 语法、选项和说明的详细列表。 | 
Examples
certreq -submit
若要提交基本证书请求,请执行以下操作:
certreq -submit certrequest.req certnew.cer certnew.pfx
Remarks
- 这是默认 certreq.exe 参数。 如果在命令行提示符下未指定任何选项,certreq.exe 会尝试向证书颁发机构提交证书请求。 使用 -submit 选项时,必须指定证书请求文件。 如果省略此参数,则会出现一个通用 的“文件打开” 窗口,让您选择适当的证书请求文件。 
- 若要通过指定 SAN 属性来请求证书,请参阅 Microsoft 知识库文章 931351 如何将使用者可选名称添加到安全 LDAP 证书的“如何使用 certreq.exe 实用工具创建和提交证书请求”部分。 
certreq -retrieve
若要检索证书 ID 20 并创建名为 MyCertificate 的证书文件 (.cer) 请执行以下作:
certreq -retrieve 20 MyCertificate.cer
Remarks
- 在证书颁发机构颁发证书后,使用 certreq -retrieve requestid 检索证书。 requestid PKC 可以是带有 0x 前缀的十进制或十六进制,也可以是没有 0x 前缀的证书序列号。 还可以使用它来检索证书颁发机构颁发的任何证书,包括吊销或过期的证书,而不考虑证书的请求是否处于挂起状态。 
- 如果向证书颁发机构提交请求,那么证书颁发机构的策略模块可能会将请求保持在挂起状态,并将 请求 ID 返回给 certreq 调用方进行显示。 最终,证书颁发机构的管理员会颁发证书或拒绝请求。 
certreq -new
若要创建新请求,请执行以下操作:
[newrequest]
; At least one value must be set in this section
subject = CN=W2K8-BO-DC.contoso2.com
下面是可以添加到 INF 文件的一些可能部分:
[newrequest]
对于任何新的证书请求模板,INF 文件的此区域是必需的,并且必须至少包含一个带有值的参数。
| Key1 | Description | Value2 | Example | 
|---|---|---|---|
| Subject | 多个应用依赖于证书中的使用者信息。 建议为此键指定值。 如果未在此处设置使用者,建议将使用者名称包含在使用者可选名称证书扩展中。 | 相对可分辨名称字符串值 | Subject = CN=computer1.contoso.com Subject=CN=John Smith,CN=Users,DC=Contoso,DC=com | 
| Exportable | 如果设置为 TRUE,则可以使用证书导出私钥。 为了确保高级别的安全性,私钥不应是可导出的;但是,在某些情况下,如果多台计算机或用户必须共享同一私钥,则可能需要私钥是可导出的。 | true | false | Exportable = TRUE. CNG 键可以将其与可导出的纯文本区分开来。 CAPI1 键则不能。 | 
| ExportableEncrypted | 指定是否应将私钥设置为可导出。 | true | false | ExportableEncrypted = true
              提示: 并非所有公钥大小和算法都适用于所有哈希算法。 指定的 CSP 还必须支持指定的哈希算法。 若要查看支持的哈希算法的列表,可以运行命令: | 
| HashAlgorithm | 要用于此请求的哈希算法。 | Sha256, sha384, sha512, sha1, md5, md4, md2 | HashAlgorithm = sha1. 若要查看支持的哈希算法的列表,请使用:certutil -oid 1 | findstr pwszCNGAlgid | findstr /v CryptOIDInfo | 
| KeyAlgorithm | 服务提供商用于生成公钥和私钥对的算法。 | RSA, DH, DSA, ECDH_P256, ECDH_P521, ECDSA_P256, ECDSA_P384, ECDSA_P521 | KeyAlgorithm = RSA | 
| KeyContainer | 不建议为生成新密钥材料的新请求设置此参数。 密钥容器由系统自动生成和维护。 对于应使用现有密钥材料的请求,可以将此值设置为现有密钥的密钥容器名称。 使用  | 随机字符串值 提示: 在具有空格或特殊字符的任何 INF 键值周围使用双引号,以避免潜在的 INF 分析问题。 | KeyContainer = {C347BD28-7F69-4090-AA16-BC58CF4D749C} | 
| KeyLength | 定义公钥和私钥的长度。 密钥长度会影响证书的安全级别。 密钥长度越长,通常提供的安全级别就越高;但是,某些应用程序的密钥长度可能存在限制。 | 加密服务提供程序支持的任何有效密钥长度。 | KeyLength = 2048 | 
| KeySpec | 确定密钥是否可用于签名、交换(加密)或者同时用于这两者。 | AT_NONE, AT_SIGNATURE, AT_KEYEXCHANGE | KeySpec = AT_KEYEXCHANGE | 
| KeyUsage | 定义证书密钥的用途。 | 
 | KeyUsage = CERT_DIGITAL_SIGNATURE_KEY_USAGE | CERT_KEY_ENCIPHERMENT_KEY_USAGE
              提示: 多个值使用管道 (|) 符号分隔符。 确保在使用多个值时使用双引号,以避免 INF 分析问题。 显示的值为每个位定义的十六进制(十进制)值。 也可以使用较旧的语法:设置多个位的单个十六进制值,而不是符号表示形式。 例如  | 
| KeyUsageProperty | 检索一个值,该值标识私钥的特定用途。 | 
 | KeyUsageProperty = NCRYPT_ALLOW_DECRYPT_FLAG | NCRYPT_ALLOW_SIGNING_FLAG | 
| MachineKeySet | 需要创建由计算机而不是用户拥有的证书时,此密钥非常重要。 生成的密钥材料在已创建请求的安全主体(用户或计算机帐户)的安全上下文中维护。 当管理员代表计算机创建证书请求时,必须在计算机的安全上下文而不是管理员的安全上下文中创建密钥材料。 否则,计算机无法访问其私钥,因为它位于管理员的安全上下文中。 | true | false. 默认值为 false。 | MachineKeySet = true | 
| NotBefore | 指定一个日期或日期和时间,在此之前无法发出请求。 NotBefore可以与ValidityPeriod和ValidityPeriodUnits一起使用。 | 日期或日期和时间 | NotBefore = 7/24/2012 10:31 AM
              提示: | 
| NotAfter | 指定一个日期或日期和时间,在此之后无法发出请求。 NotAfter无法与ValidityPeriod或ValidityPeriodUnits一起使用。 | 日期或日期和时间 | NotAfter = 9/23/2014 10:31 AM
              提示: | 
| PrivateKeyArchive | 仅当相应的 RequestType 设置为 CMC 时,PrivateKeyArchive 设置才有效,因为只有 Certificate Management Messages over CMS (CMC) 请求格式才允许将请求者的私钥安全地传输到 CA 进行密钥存档。 | true | false | PrivateKeyArchive = true | 
| EncryptionAlgorithm | 要使用的加密算法。 | 可能的选项因操作系统版本和已安装的加密提供程序集而异。 若要查看可用算法的列表,请运行命令: certutil -oid 2 | findstr pwszCNGAlgid。 使用的指定 CSP 还必须支持指定的对称加密算法和长度。 | EncryptionAlgorithm = 3des | 
| EncryptionLength | 要使用的加密算法的长度。 | 指定的 EncryptionAlgorithm 允许的任何长度。 | EncryptionLength = 128 | 
| ProviderName | 提供程序名称是 CSP 的显示名称。 | 如果不知道所使用的 CSP 的提供程序名称,请从命令行运行 certutil -csplist。 该命令显示本地系统上可用的所有 CSP 的名称 | ProviderName = Microsoft RSA SChannel Cryptographic Provider | 
| ProviderType | 提供程序类型用于根据特定算法功能(如 RSA Full)选择特定提供程序。 | 如果不知道所使用的 CSP 的提供程序类型,请从命令行提示符运行 certutil -csplist。 该命令显示本地系统上可用的所有 CSP 的提供程序类型。 | ProviderType = 1 | 
| RenewalCert | 如果需要续订生成证书请求的系统上存在的证书,则必须将其证书哈希指定为此密钥的值。 | 创建证书请求的计算机中可用的任何证书的证书哈希。 如果不知道证书哈希,请使用证书 MMC 管理单元并查看应续订的证书。 打开证书属性并查看证书的 Thumbprint属性。 证书续订需要PKCS#7或CMC请求格式。 | RenewalCert = 4EDF274BD2919C6E9EC6A522F0F3B153E9B1582D | 
| RequesterName | 发出代表其他用户进行注册的请求。 该请求还必须使用注册代理证书进行签名,否则 CA 将拒绝请求。 使用 -cert选项指定注册代理证书。 如果RequestType设置为PKCS#7或CMC,则可以为证书请求指定请求者名称。 如果RequestType设置为PKCS#10,则会忽略此键。 只能将Requestername设置为请求的一部分。 不能在挂起的请求中操作Requestername。 | Domain\User | Requestername = Contoso\BSmith | 
| RequestType | 确定用于生成和发送证书请求的标准。 | 
 | RequestType = CMC | 
| SecurityDescriptor | 包含与安全对象关联的安全信息。 对于大多数安全对象,可以在创建对象的函数调用中指定对象的安全描述符。基于安全描述符定义语言的字符串。 提示: 这仅与计算机上下文非智能卡密钥相关。 | SecurityDescriptor = D:P(A;;GA;;;SY)(A;;GA;;;BA) | |
| AlternateSignatureAlgorithm | 指定并检索一个布尔值,该值指示 PKCS#10 请求或证书签名的签名算法对象标识符 (OID) 是离散的还是组合的。 | true | false | AlternateSignatureAlgorithm = false对于 RSA 签名, | 
| Silent | 默认情况下,此选项允许 CSP 访问交互式用户桌面,并从用户那里请求智能卡 PIN 等信息。 如果此密钥设置为 TRUE,则 CSP 不得与桌面交互,并且将被阻止向用户显示任何用户界面。 | true | false | Silent = true | 
| SMIME | 如果此参数设置为 TRUE,则会将对象标识符值为 1.2.840.113549.1.9.15 的扩展添加到请求中。 对象标识符的数量取决于安装的操作系统版本和 CSP 功能,这些功能是指安全多用途 Internet 邮件扩展 (S/MIME) 应用程序(如 Outlook)可能使用的对称加密算法。 | true | false | SMIME = true | 
| UseExistingKeySet | 此参数用于指定在生成证书请求时应使用现有密钥对。 如果此密钥设置为 TRUE,则还必须为 RenewalCert 密钥或 KeyContainer 名称指定一个值。 不得设置可导出的密钥,因为无法更改现有密钥的属性。 在这种情况下,生成证书请求时不会生成任何密钥材料。 | true | false | UseExistingKeySet = true | 
| KeyProtection | 指定一个值,该值指示在使用私钥之前如何保护私钥。 | 
 | KeyProtection = NCRYPT_UI_FORCE_HIGH_PROTECTION_FLAG | 
| SuppressDefaults | 指定一个布尔值,该值指示请求中是否包含默认扩展和属性。 默认值由其对象标识符 (OID) 表示。 | true | false | SuppressDefaults = true | 
| FriendlyName | 新证书的友好名称。 | 文本 | FriendlyName = Server1 | 
| ValidityPeriodUnits | 指定要与 ValidityPeriod 一起使用的单位数。 注意:只有 request type=cert时才使用。 | Numeric | ValidityPeriodUnits = 3 | 
| ValidityPeriod | ValidityPeriod 必须是美国英语复数时间段。 注意:只有在请求类型=cert 时才使用。 | Years |  Months | Weeks | Days | Hours | Minutes | Seconds | ValidityPeriod = Years | 
1等号 (=) 左侧的参数
阿拉伯数字等号 (=) 右侧的参数
[Extensions]
本部分是可选的。
| Extension OID | Definition | Example | 
|---|---|---|
| 2.5.29.17 | 2.5.29.17 = {文本} | |
| _continue_ | continue = UPN=User@Domain.com& | |
| _continue_ | continue = EMail=User@Domain.com& | |
| _continue_ | continue = DNS=host.domain.com& | |
| _continue_ | continue = DirectoryName=CN=Name,DC=Domain,DC=com& | |
| _continue_ | continue = URL=<http://host.domain.com/default.html&> | |
| _continue_ | continue = IPAddress=10.0.0.1& | |
| _continue_ | continue = RegisteredId=1.2.3.4.5& | |
| _continue_ | continue = 1.2.3.4.6.1={utf8}String& | |
| _continue_ | continue = 1.2.3.4.6.2={octet}AAECAwQFBgc=& | |
| _continue_ | continue = 1.2.3.4.6.2={octet}{hex}00 01 02 03 04 05 06 07& | |
| _continue_ | continue = 1.2.3.4.6.3={asn}BAgAAQIDBAUGBw==& | |
| _continue_ | continue = 1.2.3.4.6.3={hex}04 08 00 01 02 03 04 05 06 07 | |
| 2.5.29.37 | 2.5.29.37={text} | |
| _continue_ | continue = 1.3.6.1.5.5.7 | |
| _continue_ | continue = 1.3.6.1.5.5.7.3.1 | |
| 2.5.29.19 | {text}ca=0pathlength=3 | |
| Critical | Critical=2.5.29.19 | |
| KeySpec | 
 | |
| RequestType | 
 | |
| KeyUsage | 
 | |
| KeyUsageProperty | 
 | |
| KeyProtection | 
 | |
| SubjectNameFlags | 模板 | 
 | 
| X500NameFlags | 
 | 
Note
              SubjectNameFlags 允许 INF 文件指定应根据当前用户或当前计算机属性(DNS 名称、UPN 等)由 certreq 自动填充哪些 Subject 和 SubjectAltName 扩展字段。 使用文本模板意味着使用模板名称标志。 这允许在多个上下文中使用单个 INF 文件,以生成具有特定于上下文的使用者信息的请求。
              X500NameFlags指定当值转换为 ASN.1 编码的可分辨CertStrToName时Subject INF keys要直接传递给  API 的标志。
Example
若要在记事本中创建策略文件 (.inf) 并将其另存为 requestconfig.inf,请执行以下作:
[NewRequest]
Subject = CN=<FQDN of computer you are creating the certificate>
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xf0
MachineKeySet = TRUE
[RequestAttributes]
CertificateTemplate=WebServer
[Extensions]
OID = 1.3.6.1.5.5.7.3.1
OID = 1.3.6.1.5.5.7.3.2
在为其请求证书的计算机上:
certreq -new requestconfig.inf certrequest.req
对 OID 和其他难以解释的数据使用 [Strings] 节语法。 EKU 扩展的新 {text} 语法示例,它使用逗号分隔的 OID 列表:
[Version]
Signature=$Windows NT$
[Strings]
szOID_ENHANCED_KEY_USAGE = 2.5.29.37
szOID_PKIX_KP_SERVER_AUTH = 1.3.6.1.5.5.7.3.1
szOID_PKIX_KP_CLIENT_AUTH = 1.3.6.1.5.5.7.3.2
[NewRequest]
Subject = CN=TestSelfSignedCert
Requesttype = Cert
[Extensions]
%szOID_ENHANCED_KEY_USAGE%={text}%szOID_PKIX_KP_SERVER_AUTH%,
_continue_ = %szOID_PKIX_KP_CLIENT_AUTH%
若要指定使用者可选名称 (SAN),请在 INF 的[扩展]部分中添加该名称。 For example:
[Version]
Signature=$Windows NT$
 
[Strings]
szOID_ENHANCED_KEY_USAGE = 2.5.29.37
szOID_PKIX_KP_SERVER_AUTH = 1.3.6.1.5.5.7.3.1
szOID_PKIX_KP_CLIENT_AUTH = 1.3.6.1.5.5.7.3.2
[NewRequest]
Subject = CN=TestSelfSignedCert
Requesttype = Cert
[Extensions]
2.5.29.17 = "{text}"
_continue_ = "DNS=example.com"
_continue_ = "DNS=www.example.com"
_continue_ = "IP Address=192.168.1.1"
在此示例中,2.5.29.17 是定义 SAN 的 OID。 为了指定多个 SAN,_continue_ 将使用扩展 OID,这样就可以分隔和指定每个 SAN 扩展。
certreq -accept
              -accept 参数将以前生成的私钥与颁发的证书链接起来,并从请求证书的系统中删除挂起的证书请求(如果有匹配的请求)。
若要手动接受证书,请执行以下操作:
certreq -accept certnew.cer
Warning
将参数与 和 -accept-user 选项一起使用-machine指示安装证书是否应安装在用户或计算机上下文中。 如果在任一上下文中存在与所安装的公钥匹配的未完成请求,则不需要这些选项。 如果没有未完成的请求,则必须指定其中一个选项。
certreq -policy
policy.inf 文件是一个配置文件,用于定义在定义合格的从属时应用于 CA 认证的约束。
若要生成交叉证书请求,请执行以下操作:
certreq -policy certsrv.req policy.inf newcertsrv.req
使用不带任何其他参数的 certreq -policy 将打开一个对话框窗口,允许你选择请求的文件(.req、.cmc、.txt、.der、.cer 或 .crt)。 选择请求的文件并单击“ 打开”后,将打开另一个对话框窗口,允许您选择 policy.inf 文件。
Examples
在 CAPolicy.inf 语法中查找 policy.inf 文件的示例。
certreq -sign
若要创建新的证书请求,请对其进行签名并提交:
certreq -new policyfile.inf myrequest.req
certreq -sign myrequest.req myrequest.req
certreq -submit myrequest_sign.req myrequest_cert.cer
Remarks
- 使用不带任何其他参数的 - certreq -sign将打开一个对话框窗口,以便你能够选择请求的文件(req、cmc、txt、der、cer 或 crt)。
- 对合格的从属请求进行签名可能需要 企业管理员 凭据。 这是为合格从属颁发签名证书的最佳做法。 
- 用于对合格的从属请求进行签名的证书使用合格的从属模板。 企业管理员必须对请求进行签名,或向对证书进行签名的个人授予用户权限。 
- 可能需要设置在你之后再让其他人员对 CMC 请求进行签名。 这取决于与合格的从属关联的保证级别。 
- 如果要安装的合格从属 CA 的父 CA 处于脱机状态,则必须从脱机父级获取合格从属 CA 的 CA 证书。 如果父 CA 处于联机状态,请在证书服务安装向导期间为合格的从属 CA 指定 CA 证书。 
certreq -enroll
可以使用此注释来注册或续订证书。
Examples
要注册证书,请使用 WebServer 模板,并使用 U/I 选择策略服务器:
certreq -enroll -machine -policyserver * WebServer
若要使用序列号续订证书,请执行以下操作:
certreq -enroll -machine -cert 61 2d 3c fe 00 00 00 00 00 05 renew
只能续订有效的证书。 过期的证书不能续订,必须用新证书替换。
选项
| 选项 | Description | 
|---|---|
| -any | Force ICertRequest::Submit用于确定编码类型。 | 
| -属性 <attributestring> | 指定 Name 和 Value 字符串对,用冒号分隔。 使用(例如,Name1:value1\nName2:value2)分隔 Name 和  | 
| -binary | 将输出文件设置为二进制格式,而不是 base64 编码形式。 | 
| -policyserver (策略服务器) <policyserver> | LDAP: <path>插入运行证书注册策略 Web 服务的计算机的 URI 或唯一 ID。 若要指定希望通过浏览使用请求文件,只需对  | 
| -配置 <ConfigString> | 使用配置字符串中指定的 CA( 即 CAHostName\CAName)处理作。 对于 https:\\ 连接,请指定注册服务器 URI。 对于本地计算机存储 CA,请使用减号 (-)。 | 
| -anonymous | 对证书注册 Web 服务使用匿名凭据。 | 
| -kerberos | 对证书注册 Web 服务使用 Kerberos(域)凭据。 | 
| -客户端证书 <ClientCertId> | 可以将 <ClientCertId>替换为证书指纹、CN、EKU、模板、电子邮件、UPN 或新的name=value语法。 | 
| -用户名 <username> | 与证书注册 Web 服务一起使用。 您可以用 <username>SAM 名称或 域\用户 值替换。 此选项与-p选项一起使用。 | 
| -p <password> | 与证书注册 Web 服务一起使用。 将 <password>替换为实际用户的密码。 此选项与-username选项一起使用。 | 
| -user | 为新证书请求配置 -user上下文,或为证书接受指定上下文。 如果 INF 或模板中未指定任何内容,则这是默认上下文。 | 
| -machine | 为新证书请求配置计算机上下文,或为证书接受指定上下文。 对于新请求,它必须与 MachineKeyset INF 键和模板上下文一致。 如果未指定此选项,并且模板未设置上下文,则默认为用户上下文。 | 
| -crl | 在 certchainfileout指定的 base64 编码 PKCS #7 文件或requestfileout指定的 base64 编码文件的输出中包括证书吊销列表 (CRL)。 | 
| -rpc | 指示 Active Directory 证书服务 (AD CS) 使用远程过程调用 (RPC) 服务器连接而不是分布式 COM。 | 
| -adminforcemachine | 使用密钥服务或模拟从本地系统上下文提交请求。 要求调用此选项的用户是本地管理员的成员。 | 
| -renewonbehalfof | 代表签名证书中标识的使用者提交续订。 这在调用 ICertRequest::Submit 方法时设置CR_IN_ROBO | 
| -f | 强制覆盖现有文件。 这也会绕过缓存模板和策略。 | 
| -q | 使用安静模式;禁止显示所有交互窗口提示。 | 
| -unicode | 当重定向标准输出或通过管道将标准输出传递给另一个命令时,写入 Unicode 输出,这在从 Windows PowerShell 脚本调用时会有所帮助。 | 
| -unicodetext | 将 base64 文本编码的数据 Blob 写入文件时,发送 Unicode 输出。 | 
Formats
| Formats | Description | 
|---|---|
| requestfilein | Base64 编码或二进制输入文件名:PKCS #10 证书请求、CMS 证书请求、PKCS #7 证书续订请求、要交叉认证的 X.509 证书或 KeyGen 标记格式证书请求。 | 
| requestfileout | Base64 编码的输出文件名。 | 
| certfileout | Base64 编码的 X-509 文件名。 | 
| PKCS10fileout | 仅用于 certreq -policy参数。 Base64 编码的 PKCS10 输出文件名。 | 
| certchainfileout | Base64 编码的 PKCS #7 文件名。 | 
| fullresponsefileout | Base64 编码的完整响应文件名。 | 
| policyfilein | 仅用于 certreq -policy参数。 包含扩展的文本表示形式的 INF 文件常用于鉴定请求。 | 
Additional Resources
以下文章包含 certreq 用法的示例: