OpenSSL

加密和 SSL/TLS 工具包

openssl-req

名称

openssl-req - PKCS#10 证书请求和证书生成命令

语法

openssl req [-help] [-inform DER|PEM] [-outform DER|PEM] [-in 文件名] [-passin 参数] [-out 文件名] [-passout 参数] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-newkey 参数] [-pkeyopt 选项:] [-noenc] [-nodes] [-key 文件名|URI] [-keyform DER|PEM|P12|ENGINE] [-keyout 文件名] [-keygen_engine ID] [-摘要算法] [-config 文件名] [-section 名称] [-x509] [-x509v1] [-CA 文件名|URI] [-CAkey 文件名|URI] [-days 天数] [-set_serial 序列号] [-newhdr] [-copy_extensions 参数] [-extensions 段落] [-reqexts 段落] [-addext 扩展] [-precert] [-utf8] [-reqopt] [-subject] [-subj 参数] [-multivalue-rdn] [-sigopt 名称:] [-vfyopt 名称:] [-batch] [-verbose] [-quiet] [-nameopt 选项] [-rand 文件] [-writerand 文件] [-engine ID] [-provider 名称] [-provider-path 路径] [-propquery 属性查询]

描述

此命令主要创建和处理PKCS#10格式的证书请求(CSR)。此外,它还可以创建自签名证书,例如用作根CA。

选项

-help

打印使用信息。

-inform DER|PEM

要使用的CSR输入文件格式;默认情况下,首先尝试PEM。有关详细信息,请参见openssl-format-options(1)

-outform DER|PEM

输出格式;默认为未指定。有关详细信息,请参见openssl-format-options(1)

数据是PKCS#10对象。

-in 文件名

这指定了要从中读取请求的输入文件名。默认为标准输入,除非指定了-x509-CA。仅当未指定创建选项(-new-newkey-precert)时,才会读取请求。

-sigopt 名称:

在签名操作期间将选项传递给签名算法。这些选项的名称和值是特定于算法的。

-vfyopt 名称:

在验证操作期间将选项传递给签名算法。这些选项的名称和值是特定于算法的。

-passin 参数

私钥和证书输入的密码源。有关参数格式的更多信息,请参见openssl-passphrase-options(1)

-passout 参数

输出文件的密码源。有关参数格式的更多信息,请参见openssl-passphrase-options(1)

-out 文件名

这指定了要写入的输出文件名,默认为标准输出。

-text

以文本形式打印证书请求。

-subject

打印证书请求主题(如果使用-x509,则打印证书主题)。

-pubkey

打印公钥。

-noout

此选项阻止输出证书请求的编码版本。

-modulus

打印请求中包含的公钥模数的值。

-verify

验证请求上的自签名。如果验证失败,程序将立即退出,即跳过进一步的选项处理(例如-text)。

-new

此选项生成新的证书请求。它将提示用户输入相关字段值。实际提示的字段及其最大和最小大小在配置文件和任何请求的扩展中指定。

如果没有给出-key选项,它将使用配置文件中指定的或使用-newkey-pkeyopt选项给出的信息生成新的私钥,否则默认为长度为2048位的RSA密钥。

-newkey 参数

除非给出-key,否则此选项用于生成新的私钥。随后将其用作使用-key选项给出的方式。

此选项意味着-new标志,用于创建新的证书请求或在使用-x509的情况下创建新的证书。

参数采用多种形式之一。

[rsa:]位数生成大小为位数的RSA密钥。如果省略了位数,即指定了-newkey rsa,则如果存在,则使用配置文件中使用default_bits选项指定的默认密钥大小,否则使用2048。

所有其他算法都支持-newkey 算法名称:文件形式,其中文件是算法参数文件,由openssl genpkey -genparam创建,或用于具有适当算法的密钥的X.509证书。

param:文件使用参数文件或证书文件生成密钥,算法由参数确定。

算法名称[:文件]使用给定的算法算法名称生成密钥。如果给出了参数文件文件,则使用其中指定的参数,其中算法参数必须与算法名称匹配。如果没有给出算法参数,则应通过-pkeyopt选项指定任何必要的参数。

dsa:文件名使用文件文件名中的参数生成DSA密钥。ec:文件名生成EC密钥(可与ECDSA或ECDH算法一起使用),gost2001:文件名生成GOST R 34.10-2001密钥(需要在配置文件中配置gost引擎)。如果只指定了gost2001,则应通过-pkeyopt paramset:X指定参数集。

-pkeyopt 选项:

将公钥算法选项选项设置为。支持的精确选项集取决于使用的公钥算法及其实现。有关更多详细信息,请参见openssl-genpkey(1)中的“密钥生成选项”

-key 文件名|URI

此选项提供用于签署新证书或证书请求的私钥。除非给出-in,否则相应的公钥将放置在新证书或证书请求中,从而导致自签名。

对于证书签名,此选项将被-CA选项覆盖。

此选项也接受PEM格式文件的PKCS#8格式私钥。

-keyform DER|PEM|P12|ENGINE

私钥的格式;默认为未指定。有关详细信息,请参见openssl-format-options(1)

-keyout 文件名

这给出了要将任何新创建或从-key读取的私钥写入的文件名。如果既没有给出-keyout选项也没有给出-key选项,则如果存在,则使用配置文件中使用default_keyfile选项指定的文件名。因此,如果您想写入私钥并且提供了-key选项,则应明确提供-keyout选项。如果生成了新密钥并且没有指定文件名,则密钥将写入标准输出。

-noenc

如果指定了此选项,则如果创建了私钥,则不会对其进行加密。

-nodes

此选项自OpenSSL 3.0起已弃用;请改用-noenc

-摘要算法

这指定了用于签署请求的消息摘要。可以使用OpenSSL dgst命令支持的任何摘要。这将覆盖配置文件中指定的摘要算法。

某些公钥算法可能会覆盖此选择。例如,DSA签名始终使用SHA1,GOST R 34.10签名始终使用GOST R 34.11-94(-md_gost94),Ed25519和Ed448从不使用任何摘要。

-config 文件名

这允许指定替代配置文件。可选;有关默认值的说明,请参见openssl(1)中的“命令摘要”

-section 名称

指定要使用的段落名称;默认为req

-subj 参数

设置新请求的主题名称,或在处理证书请求时替换主题名称。

参数必须格式化为/type0=value0/type1=value1/type2=...。特殊字符可以通过\(反斜杠)转义,保留空格。允许空值,但相应的类型不会包含在请求中。给出单个/将导致空RDN序列(NULL-DN)。可以通过在指定集合成员的AttributeValueAssertions(AVA)之间放置+字符而不是/字符来形成多值RDN。示例

/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe

-multivalue-rdn

此选项已弃用,没有效果。

-x509

此选项输出证书而不是证书请求。这通常用于生成测试证书。它由-CA选项隐含。

如果未给出-in,则此选项意味着-new标志。

如果使用-in选项指定了现有请求,则将其转换为证书;否则将从头创建请求。

除非使用-set_serial选项,否则将使用大随机数作为序列号。

除非使用-copy_extensions选项,否则不会从任何提供的请求输入文件中复制X.509扩展。

要添加的X.509扩展可以在配置文件中指定,可能使用-config-extensions选项,以及/或者使用-addext选项。

除非给出-x509v1,否则生成的证书将带有X.509版本3。除非另有指定,否则将包含密钥标识符扩展,如x509v3_config(5)中所述。

-x509v1

请求生成具有X.509版本1的证书。这意味着-x509。如果给出了X.509扩展,则无论如何都会设置X.509版本3。

-CA 文件名|URI

指定要用于签署新证书的“CA”证书,并意味着使用-x509。出现时,其行为类似于“微型CA”,如下所示:“CA”证书的主题名称将作为发行者名称放置在新证书中,然后使用如下所述指定的“CA”密钥对其进行签名。

-CAkey 文件名|URI

设置用于签署证书的“CA”私钥。私钥必须与使用-CA给出的证书的公钥匹配。如果没有提供此选项,则密钥必须存在于-CA输入中。

-days 天数

当使用-x509时,这指定了为证书认证的天数,否则将被忽略。天数应为正整数。默认为30天。

-set_serial 序列号

输出自签名证书时要使用的序列号。如果前面有0x,则可以将其指定为十进制值或十六进制值。如果未给出,将使用大随机数。

-copy_extensions 参数

确定当使用-x509时如何处理证书请求中的X.509扩展。如果参数none或此选项不存在,则忽略扩展。如果参数copycopyall,则将请求中的所有扩展复制到证书。

此选项的主要用途是允许证书请求为某些扩展(例如 subjectAltName)提供值。

-extensions section, -reqexts section

可用于覆盖配置文件节的名称,从中包含证书(当使用-x509时)或证书请求中的 X.509 扩展。这允许在同一个配置文件中使用多个不同的节来指定用于各种目的的请求。

-addext ext

向证书(如果使用-x509)或证书请求添加特定扩展。参数必须采用key=value对的形式,就像它在配置文件中出现的那样。

此选项可以多次使用。

-precert

将向证书添加一个毒性扩展,使其成为“预证书”(参见 RFC6962)。这可以提交到证书透明度日志以获取签名的证书时间戳 (SCT)。然后,可以在删除毒性并签署证书之前,将这些 SCT 作为扩展嵌入到预证书中。

这意味着-new标志。

-utf8

此选项会导致字段值被解释为 UTF8 字符串,默认情况下它们被解释为 ASCII 字符串。这意味着字段值,无论是从终端提示还是从配置文件获取,都必须是有效的 UTF8 字符串。

-reqopt option

自定义与-text一起使用的打印格式。option参数可以是单个选项或用逗号分隔的多个选项。

请参阅openssl-x509(1)命令中-certopt参数的讨论。

-newhdr

在输出的请求的 PEM 文件头和尾部行中添加单词NEW。某些软件(Netscape 证书服务器)和某些 CA 需要此功能。

-batch

非交互模式。

-verbose

打印有关正在执行的操作的额外详细信息。

-quiet

打印有关正在执行的操作的更少详细信息,这在批处理脚本或管道期间可能很方便(特别是在密钥生成期间抑制“进度点”)。

-keygen_engine id

指定一个引擎(通过其唯一的id字符串),该引擎将用于密钥生成操作。

-nameopt option

这指定了如何显示主题或发行者名称。有关详细信息,请参阅openssl-namedisplay-options(1)

-rand files, -writerand file

有关详细信息,请参阅openssl(1)中的“随机状态选项”

-engine id

请参阅openssl(1)中的“引擎选项”。此选项已弃用。

-provider name
-provider-path path
-propquery propq

请参阅openssl(1)中的“提供程序选项”provider(7)property(7)

配置文件格式

配置选项在配置文件的req节中指定。可以使用-section选项指定备用名称。与所有配置文件一样,如果在特定节中未指定值,则也会搜索初始未命名或default节。

下面详细描述了可用的选项。

input_password, output_password

输入私钥文件(如果存在)和输出私钥文件(如果将创建)的密码。命令行选项passinpassout会覆盖配置文件值。

default_bits

指定默认密钥大小(以位为单位)。

此选项与-new选项一起使用以生成新的密钥。可以通过在-newkey选项中指定显式密钥大小来覆盖它。最小的可接受密钥大小为 512 位。如果未指定密钥大小,则使用 2048 位。

default_keyfile

这是将私钥写入的默认文件名。如果未指定,则密钥将写入标准输出。这可以通过-keyout选项覆盖。

oid_file

这指定了一个包含其他对象标识符的文件。文件的每一行应包含对象标识符的数字形式,后跟空格,然后是短名称,最后是空格,然后是长名称。

oid_section

这指定了配置文件中包含额外对象标识符的节。每一行应包含对象标识符的短名称,后跟=,然后是数字形式。当使用此选项时,短名称和长名称相同。

RANDFILE

启动时,指定的文件将加载到随机数生成器中,并在退出时向其写入 256 字节。它用于私钥生成。

encrypt_key

如果将其设置为no,则如果生成私钥,则不会对其进行加密。这等效于-noenc命令行选项。为了兼容性,encrypt_rsa_key是一个等效的选项。

default_md

此选项指定要使用的摘要算法。可以使用 OpenSSL dgst命令支持的任何摘要。此选项可以在命令行中覆盖。某些签名算法(即 Ed25519 和 Ed448)将忽略已设置的任何摘要。

string_mask

此选项屏蔽在某些字段中使用某些字符串类型。大多数用户不需要更改此选项。它可以设置为多个值

utf8only - 仅使用 UTF8Strings(这是默认值)
pkix - 除 T61Strings 之外的任何字符串类型
nombstr - 除 BMPStrings 和 UTF8Strings 之外的任何字符串类型
default - 任何类型的字符串类型

请注意,utf8only是 RFC2459 在 2003 年之后以及默认string_mask的 PKIX 建议;default不是默认选项。nombstr值是对某些软件的变通方法,这些软件在处理可变大小的 BMPStrings 和 UTF8Strings 时存在问题。

req_extensions

这指定了包含要添加到证书请求的扩展列表的配置文件节。它可以通过-reqexts命令行开关覆盖。有关扩展节格式的详细信息,请参阅x509v3_config(5)手册页。

x509_extensions

这指定了包含要添加到使用-x509时生成的证书的扩展列表的配置文件节。它可以通过-extensions命令行开关覆盖。

prompt

如果设置为值no,则禁用证书字段的提示,并直接从配置文件中获取值。它还会更改distinguished_nameattributes节的预期格式。

utf8

如果设置为值yes,则字段值将被解释为 UTF8 字符串,默认情况下它们被解释为 ASCII 字符串。这意味着字段值,无论是从终端提示还是从配置文件获取,都必须是有效的 UTF8 字符串。

attributes

这指定了包含任何请求属性的节:其格式与distinguished_name相同。通常,这些可能包含 challengePassword 或 unstructuredName 类型。它们目前被 OpenSSL 的请求签名实用程序忽略,但某些 CA 可能会需要它们。

distinguished_name

这指定了包含在生成证书或证书请求时提示的区分名称字段的节。格式在下一节中描述。

区分名称和属性节格式

区分名称和属性节有两种不同的格式。如果prompt选项设置为no,则这些节仅包含字段名称和值:例如,

CN=My Name
OU=My Organization
[email protected]

这允许外部程序(例如基于 GUI 的程序)生成包含所有字段名称和值的模板文件,并将其传递给此命令。此类配置文件的示例包含在示例部分中。

或者,如果prompt选项不存在或未设置为no,则文件包含字段提示信息。它由以下形式的行组成

fieldName="prompt"
fieldName_default="default field value"
fieldName_min= 2
fieldName_max= 4

“fieldName”是正在使用的字段名称,例如 commonName(或 CN)。“prompt”字符串用于提示用户输入相关详细信息。如果用户未输入任何内容,则使用默认值,如果不存在默认值,则省略该字段。如果用户仅输入“.”字符,则即使存在默认值,也可以省略字段。

输入的字符数必须介于 fieldName_min 和 fieldName_max 限制之间:根据使用的字段可能存在其他限制(例如,countryName 只能是两个字符长,并且必须适合 PrintableString)。

某些字段(例如 organizationName)可以在 DN 中使用多次。这会带来问题,因为配置文件不会识别两次出现的相同名称。为了避免此问题,如果 fieldName 包含一些字符后跟句点,则会忽略它们。因此,例如,可以通过将其命名为“1.organizationName”来输入第二个 organizationName。

实际允许的字段名称是任何对象标识符短名称或长名称。这些已编译到 OpenSSL 中,包括常见的名称,如 commonName、countryName、localityName、organizationName、organizationalUnitName、stateOrProvinceName。此外,还包括 emailAddress 以及 name、surname、givenName、initials 和 dnQualifier。

可以使用配置文件中的oid_fileoid_section选项定义其他对象标识符。任何其他字段都将被视为 DirectoryString。

示例

检查和验证证书请求

openssl req -in req.pem -text -verify -noout

创建私钥,然后从中生成证书请求

openssl genrsa -out key.pem 2048
openssl req -new -key key.pem -out req.pem

相同的功能,但只使用 req

openssl req -newkey rsa:2048 -keyout key.pem -out req.pem

生成自签名根证书

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out req.pem

创建 SM2 私钥,然后从中生成证书请求

openssl ecparam -genkey -name SM2 -out sm2.key
openssl req -new -key sm2.key -out sm2.csr -sm3 -sigopt "distid:1234567812345678"

检查和验证 SM2 证书请求

openssl req -verify -in sm2.csr -sm3 -vfyopt "distid:1234567812345678"

oid_file选项指向的文件的示例

1.2.3.4        shortName       A longer Name
1.2.3.6        otherName       Other longer Name

oid_section指向的节的示例,利用了变量扩展

testoid1=1.2.3.5
testoid2=${testoid1}.6

提示输入字段值的配置文件示例

[ req ]
default_bits           = 2048
default_keyfile        = privkey.pem
distinguished_name     = req_distinguished_name
attributes             = req_attributes
req_extensions         = v3_ca

dirstring_type = nobmp

[ req_distinguished_name ]
countryName                    = Country Name (2 letter code)
countryName_default            = AU
countryName_min                = 2
countryName_max                = 2

localityName                   = Locality Name (eg, city)

organizationalUnitName         = Organizational Unit Name (eg, section)

commonName                     = Common Name (eg, YOUR name)
commonName_max                 = 64

emailAddress                   = Email Address
emailAddress_max               = 40

[ req_attributes ]
challengePassword              = A challenge password
challengePassword_min          = 4
challengePassword_max          = 20

[ v3_ca ]

subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer:always
basicConstraints = critical, CA:true

包含所有字段值的配置文件示例

[ req ]
default_bits           = 2048
default_keyfile        = keyfile.pem
distinguished_name     = req_distinguished_name
attributes             = req_attributes
prompt                 = no
output_password        = mypass

[ req_distinguished_name ]
C                      = GB
ST                     = Test State or Province
L                      = Test Locality
O                      = Organization Name
OU                     = Organizational Unit Name
CN                     = Common Name
emailAddress           = [email protected]

[ req_attributes ]
challengePassword              = A challenge password

在命令行上提供最常见属性(主题和扩展)的示例

openssl req -new -subj "/C=GB/CN=foo" \
                 -addext "subjectAltName = DNS:foo.co.uk" \
                 -addext "certificatePolicies = 1.2.3.4" \
                 -newkey rsa:2048 -keyout key.pem -out req.pem

注释

Xenroll使用 MSIE 生成的证书请求添加了扩展。它包括keyUsage扩展,该扩展确定密钥的类型(仅签名或通用)以及脚本在extendedKeyUsage扩展中输入的任何其他 OID。

诊断

以下消息经常被问到

Using configuration from /some/path/openssl.cnf
Unable to load config info

随后一段时间后,出现以下内容:

unable to find 'distinguished_name' in config
problems making Certificate Request

第一个错误消息是线索:它找不到配置文件!某些操作(例如检查证书请求)不需要配置文件,因此不会强制使用它。但是,证书或请求的生成确实需要配置文件。这可以被视为一个错误。

另一个令人费解的消息是:

Attributes:
    a0:00

当不存在任何属性并且请求包含正确的空SET OF结构(其 DER 编码为 0xa0 0x00)时,将显示此消息。如果您只看到

Attributes:

则缺少SET OF,并且编码在技术上无效(但可以容忍)。有关详细信息,请参阅命令行选项-asn1-kludge的描述。

错误

OpenSSL 对 T61Strings(又名 TeletexStrings)的处理已损坏:它实际上将其视为 ISO-8859-1(Latin 1),Netscape 和 MSIE 的行为类似。如果您需要 PrintableStrings 中不可用的字符并且不想或无法使用 BMPStrings,这可能会导致问题。

由于 T61String 处理,在 OpenSSL 中表示重音字符的唯一正确方法是使用 BMPString:不幸的是,Netscape 目前无法处理这些字符。如果您必须将重音字符与 Netscape 和 MSIE 一起使用,则当前需要使用无效的 T61String 形式。

当前的提示不太友好。它不允许您确认您刚刚输入的内容。证书请求中的其他内容(如扩展)在配置文件中是静态定义的。其中一些:例如 subjectAltName 中的电子邮件地址应由用户输入。

另请参阅

openssl(1)openssl-x509(1)openssl-ca(1)openssl-genrsa(1)openssl-gendsa(1)config(5)x509v3_config(5)

历史

-section 选项在 OpenSSL 3.0.0 中添加。

-multivalue-rdn 选项在 OpenSSL 3.0.0 中已过时,且无效。

-engine 选项在 OpenSSL 3.0 中已弃用。<-nodes> 选项在 OpenSSL 3.0 中也已弃用;请使用 -noenc 代替。

-reqexts 选项在 OpenSSL 3.2 中已成为 -extensions 的别名。

从 OpenSSL 3.2 开始,生成的证书除非指定 -x509v1,否则将使用 X.509 版本 3,并且默认包含密钥标识符扩展。

从 OpenSSL 3.3 开始,-verify 选项在失败时将以 1 退出。

版权所有 2000-2024 OpenSSL 项目作者。保留所有权利。

根据 Apache 许可证 2.0(“许可证”)许可。除非符合许可证的规定,否则您不得使用此文件。您可以在源代码分发包中的 LICENSE 文件或 https://www.openssl.org/source/license.html 中获取副本。