«

openssl req 帮助手册

srdf 发布于 阅读:446 OpenSSL


概要

openssl req [-help] [-inform DER|PEM] [-outform DER|PEM] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-newkey arg] [-pkeyopt opt:value] [-noenc] [-nodes] [-key filename|uri] [-keyform DER|PEM|P12|ENGINE] [-keyout filename] [-keygen_engine id] [-digest] [-config filename] [-section name] [-x509] [-CA filename|uri] [-CAkey filename|uri] [-days n] [-set_serial n] [-newhdr] [-copy_extensions arg] [-addext ext] [-extensions section] [-reqexts section] [-precert] [-utf8] [-reqopt] [-subject] [-subj arg] [-multivalue-rdn] [-sigopt nm:v] [-vfyopt nm:v] [-batch] [-verbose] [-nameopt option] [-rand files] [-writerand file] [-engine id] [-provider name] [-provider-path path] [-propquery propq]


用途

  openssl-req:PKCS#10证书请求以及证书生成指令

  这个指令主要以PKCS#10格式创建并处理证书请求(certificate requests, CSRs)。它也可以创建自签名证书用于根证书或示例。

  每个选项的用法如下:

-help

打印一些有用的信息。

-inform DER|PEM,-outform DER|PEM

输入和输出格式;默认为空。从openssl-format-options(1)获取更多信息。

-in filename

这个参数指定了要从中读取请求的文件名。默认为标准输入,除非指定了-x509-CA。如果没有指定创建选项(-new-newkey或者-precert),请求文件就是只读。

-sigopt nm:v

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

-vfyopt nm:v

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

-passin arg

私钥和证书输入的密码来源。关于arg格式的更多信息请查阅openssl-passphrase-options(1)

-passout arg

输出文件的密码来源。关于arg格式的更多信息请查阅openssl-passphrase-options(1)

-out filename

它指定了要将输出信息写入的文件,默认为标准输出。

-text

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

-subject

输出证书请求主体(使用-x509是证书主题)。

-pubkey

输出公钥。

-noout

这个选项禁止输出证书请求的加密版本。

-modulus

输出包含在请求里的公钥的模数。

-verify

核对请求中的自签名。

-new

这个选项生成新的证书请求。它会提示用户输入与字段相关的值。实际上字段的提示关于在配置文件里指定的最大值和最小值以及任何请求的扩展。

如果没有提供-key选项,它会使用配置文件里设定的信息生成一个新的私钥,或者同时提供-newkey-pkeyopt选项。默认使用2048位长度的RSA密钥。

-newkey arg

如果没有提供-key选项,就用它生成新的私钥。随后就像使用-key选项一样使用它。

这个选项说明-new参数用于创建新的证书请求或在使用-x509的情况下创建新的证书。

这个参数使用几种格式中的一个。

[rsa:]nbits 生成大小为nbits的RSA密钥。如果省略了nbits,仅指定-newkey rsa,如果使用配置文件并且有default_bits选项,默认的大小就使用该选项的数值,否则默认为2048。

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

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

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

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

-pkeyopt opt:value

使用value设置公钥算法的选项。支持的精确选项集取决于所使用的公钥算法及其实现。前往本站的OPENSSL指令介绍 - openssl genpkey获取更多信息。

-key filename|uri

这一选项提供用于签名新证书或证书请求的私钥。如果不使用-in,相应的公钥被放进新的证书或证书请求里自签名。

这个选项在证书签名是时被-CA选项代替。

这个选项也接受PKCS#8格式私钥,用于PEM格式的文件。

-keyform DER|PEM|P12|ENGINE

私钥的格式;默认未指定。查看openssl-format-options(1)了解更多信息。

-keyout filename

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

-noenc

如果指定了这个选项,那么创建的私钥不会被加密。

-nodes

这一选项从OpenSSL3.0版本起弃用,使用-noenc替代。

-digest

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

一些公钥算法可能会改变这一决定。例如,DSA数字签名算法总是使用SHA1,GOST R 34.10数字签名算法总是使用GOST R 34.11-94(-md_gost94),Ed25519 and Ed448从不使用摘要。

-config filename

它允许指定可替代的配置文件。此选项可选;关于默认值的说明,见openssl(1)里的“命令选择

-section name

指定了要使用的节点;默认是req

-subj arg

为新请求设置拥有者的名称或者在处理证书请求时替代原有的名称。

arg必须被格式化为/type0=value0/type1=value1/type2=…。特殊字符可以通过(反斜杠)转义,保留空格。允许有空值,但是相应的类型不会包含在请求里。给予一个单独的正斜杠会造成空的RDN序列(空的DN)。拥有多个条目的RDN可以通过在指定集合成员的属性值断言(AVA)之间使用加号字符而不是斜杠来形成。例如:

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

-multivalue-rdn

强烈反对使用这个选项,它没有用。

-x509

这个选项输出证书,作为证书请求的替代。它常用于生成测试证书。它由-CA选项暗示。

如果未给出-in选项,它暗含-new选项。

如果一个现有的请求被-in选项指定,它会被转换为证书;否则会重新创建一个请求。

如果不指定-set_serial选项,就使用一个大的随机数作为序列号。

除非使用了-copy_extensions选项,否则X.509扩展不会从任何文件里复制请求。

可以在配置文件中或使用-addext选项指定要添加的X.509扩展。

-CA

指定用于签署新证书的“CA”证书并意味着使用 -x509。当(?)存在时,它的表现类似于“微型CA”,如下所述:“CA"证书的主题名称被替换为新证书里的发布者名称,然后使用下方的选项给出的”CA“密钥签名。

-CAkey filename|uri

指定用于签署证书的私钥。私钥必须与-CA选项提供的证书的公钥匹配。如果未提供这一选项,那么密钥必须由-CA选项输入。

-days n

使用-x509时它指明了证书的有效期,会被其它选项忽略。默认为30天。

-set_serial n

输出自签名证书时使用的序列号。它可以被指定为双精度数值或者以0x开头的十六进制值。如果未提供数值,就使用一个大的随机数。

-copy_extensions arg

当你使用-x509时决定-x509应如何处理证书请求。如果arg参数为空或者不存在这个选项,就忽略扩展。

这一选项的主要用途时允许证书请求为某些扩展提供值,例如subjectAltName。

-addext ext

为证书(如果用-x509)或证书请求添加特定的扩展。参数必须为键值对格式,因为它可能出现在配置文件里。

这一选项可以被多次提供。

-extensions section

-reqexts section

这个选项指定了用于导入证书扩展(如果使用-x509)或证书请求的可选节点。这允许在同一配置文件中使用多个不同的部分来指定用于各种目的的请求。

-precert

位置扩展将被写入证书,使其成为“pre-certificate”(见RFC6962)。它可以被提交到证书透明度日志,目的是获得签名的证书时间戳。这些证书的时间戳可以在移动位置以及签名证书之前插入pre-certificate作为扩展。

它暗含-new选项。

-utf8

这个选项使字段值解析为UTF8字符串。默认情况下它们被解析为ASCII。这意味着无论是来自终端的输入或读取自配置文件的字段值必须为有效的UTF8字符串。

-reqopt option

使用-text修改输出格式。option参数可以时单一的选项,也可以由逗号分为多个选项。

参阅在openssl-x509(1)命令里对-certopt规划的讨论。

-newhdr

在输出请求时将单词NEW添加到文件首行和尾行。部分软件(Netscape证书服务器)和部分证书签发机构(CAs)需要这个。

-batch

无交互模式。

-verbose

输出已完成操作的细节。

-keygen_engine id

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

-nameopt option

它指定了证书使用者或证书颁发者名称的显示方式。查看openssl名称显示选项(1)了解更多信息。

-rand files,-writerand file

查看openssl(1)里的随机状态选项了解更多信息。

-engine id

查看 openssl(1)里的引擎配置选项了解更多信息。

-provider name

-provider-path path

-propquery propq

查阅 openssl(1)里的Provider配置provider(7) 以及 property(7) 获取更多信息。

配置文件的格式

配置选项在配置文件里的 req 一节中指定。使用 - section 选项指定备用名称。如同使用所有的配置文件一样,如果在特定的配置节里没有给出参数的值,那么 initial unnamed 或者 default 配置节也被搜索。

可用选项的详细信息在下方列出。

输入的私钥文件的密码(如果存在)以及输出的私钥文件密码(如果要新建私钥文件)。命令行选项 passinpassout 不使用配置文件的值。

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

这一选项用于与 - new 选项一起生成新的密钥。它可以在 - newkey 选项里指明密钥大小,以此覆盖这一选项(default_bits)。允许的最小密钥大小是512位。如果没有指定密钥大小,就使用2048位作为默认大小。

它是要写出的私钥的文件名。如果没有指定密钥,就以标准输出的形式写出密钥。-keyout 选项可以覆盖这一属性。

它指定了含有额外的对象标识符 (object identifiers) 的文件。(为了便于描述,对象标识符一词在这一选项中均简称“标识符”。如果后续选项出现重复,那个选项的说明解读。)文件的每一行都应该包含对象标识符的数字格式,然后再间隔一个空格,跟上一个短名称,再隔一个空格,跟上最终的长名称。译者按:标识符的详细信息请前往 全球对象标识符查询数据库 获取。有关注册标识符的信息,请前往 PKI solutions 了解详细信息。

它在指定了在配置文件里含有额外对象标识符的配置节。每一行应含有如下内容:标识符的短名称,跟上等于号,再跟上它的数字形式。使用此选项时短名称和长名称是一样的。

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

如果将它设为 no,那么生成的私钥不会被加密。它与命令行选项中的 -noenc 作用相同。为了兼容性,encrypt_rsa_key 是一个等效选项。

这一选项指定了要使用的数字摘要算法。OpenSSL dgst 命令中支持的算法均可使用。这一选项可以被命令行覆盖。某些签名算法(例如 Ed25519 和 Ed448)将忽略已设置的摘要。

这一选项会隐藏在某些字段里某些字符串类型的使用。多数用户不需要改变这一选项。

它可以设置为多个值,默认值预设为使用 PrintableStrings、T61Strings 和 BMPStrings,如果使用 pkix 值,则仅使用 PrintableStrings 和 BMPStrings。它遵循在 RFC2459 里对 PKIX 的建议。如果使用 utf8only 选项,那么就使用 UTF8Strings:这是在2003年以后的 RFC2459 里对PKIX的建议。最后 nombstr 选项仅使用 PrintableStrings 和 T61Strings:有些软件在 BMPStrings 和 UTF8Strings 中存在问题:特别是网景。

它指定了在配置文件中包含了扩展列表的配置节,用于添加到证书请求中。它可以被 -reqexts 命令行开关覆盖。前往  x509v3_config(5) 手册页查看扩展节格式的详细信息。

使用 -x509 时,它指定了在配置文件中包含了扩展列表的配置节,用于在证书生成时添加。它可以被 -extensions 命令行选项覆盖。

如果这一字段设为 no,它就禁用证书字段的提示,并且仅从配置文件中直接获取参数值。它也会改变 distinguished_nameattributes 一节中预期的格式。

如果将值设为 yes,那么字段值会被转义为 UTF8 字符串,默认情况下它们被解释为 ASCII。这意味着无论是终端里的提示文本,还是从配置文件中获得的参数值,都必须是有效的 UTF8 字符串。

它指定了包含任意请求属性的配置节:它的格式与 distinguished_name 一致。通常它们包含 challengePassword 或 unstructuredName 类型。目前它们会被 OpenSSL 的请求签名程序忽略,但是一些 CA 可能需要它们。

它指定了包含有用于在生成证书或者证书请求时在终端显示的提示字段所在的配置节。它的格式在下一节中描述。

特征名(distinguished name)与属性(attributes)配置节的格式

特征名和属性有两种不同的格式。如果 prompt 选项设为 no,那么这些配置节仅包含字段名与字段值:例如,

CN=My Name
OU=My Organization
emailAddress=someone@somewhere.org

这样允许外部程序(例如,GUI程序)生成一个含有所有字段名与字段值的模板文件,并且只需把它传递给本文正在解释的命令(openssl req)。这种配置文件的示例包含在示例一节。

或者,如果未使用 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 包含一些跟着句号的字符,它们将被忽略。例如,将第二个 organizationName 命名为 “1.organizationName”,它就可以接收来自终端的输入。

实际允许的字段名称是对象标识符短名称或长名称。 它们和常用之一起被编译到 OpenSSL 中,例如 commonName、countryName、localityName、organizationName、organizationalUnitName、stateOrProvinceName。 此外,还包括 emailAddress 以及 name、surname、givenName、initials 以及 dnQualifier。

额外的对象标识符可以由配置文件里的 oid_file 或者 oid_section 选项定义。其他字段被视为 DirectoryString。

示例

检查并验证证书请求:

# 读取并打印req.pem,然后核对请求中的自签名,并禁止输出证书请求的加密版本。
openssl req -in req.pem -text -verify -noout

创建一个私钥,然后用它生成证书请求:

# 生成名为key.pem的私钥,使用rsa算法,算法长度为2048
openssl genrsa -out key.pem 2048
# 使用key.pem私钥生成新的证书请求,将输出的结果写入req.pem。
openssl req -new -key key.pem -out req.pem

仅用req实现同样的目标:

# 使用-newkey创建rsa私钥,私钥的长度是2048位,证书请求的结果输出位req.pem。
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           = test@email.address

[ 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

第一个错误信息的含义是:它找不到配置文件!某些操作(例如检验一个证书请求)不需要配置文件,因此不强制使用它。

然而,证书或请求的生成确实需要配置文件。它可能会被视为一个 bug。

其他让人困惑的消息如下:

Attributes:
    a0:00

当没有属性时它会显示,表面该请求包含正确的空 SET OF 结构(其 DER 编码为 0xa0 0x00)。如果你只看见了:

Attributes:

那么就丢失了 SET OF 结构并且编码在技术上无效(但是它可以被容忍)。查阅 -ans1-kludge 命令行选项的描述获取更多的信息。

BUGS

OpenSSL 对 T61Strings(又名 TeletexStrings)的处理被破坏:它有效地将它们视为 ISO-8859-1(拉丁语 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>选项也在这个版本中弃用;由 -noenc 代替。

版权

Copyright 2000 - 2021 OpenSSL项目作者保留所有权利。

根据 Apache License 2.0(以下简称“许可证”)获得许可。 除非遵守许可协议,否则您不得使用此文件。 您可以从源代码分发版中的 LICENSE 文件或者从 https://www.openssl.org/source/license.html 获取副本。

OpenSSL OpenSSL-req V3.1


扫描二维码,在手机上阅读
取消
微信二维码
微信二维码
支付宝二维码
收到1条评论
avatar
星辰子 2023-11-29 14:56
不可用于从私钥中直接生成公钥。
回复