openssl-req

openssl-req

名字

openssl-req – PKCS#10 certificate request and certificate generating command

概述

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] [-x509v1] [-CA filename|uri] [-CAkey filename|uri] [-not_before date] [-not_after date] [-days n] [-set_serial n] [-newhdr] [-copy_extensions arg] [-extensions section] [-reqexts section] [-addext ext] [-precert] [-utf8] [-reqopt] [-subject] [-subj arg] [-multivalue-rdn] [-sigopt nm:v] [-vfyopt nm:v] [-batch] [-verbose] [-quiet] [-nameopt option] [-rand files] [-writerand file] [-engine id] [-provider name] [-provider-path path] [-propquery propq]

描述

这个命令用于生成证书请求文件,生成的证书请求文件符合PKCS#10标准,证书请求是申请证书的第一步。
同时这个命令也能创建自签名证书。

选项说明

  • -help

    帮助

  • -inform DER|PEM

    输入的csr文件格式,默认首先尝试pem格式

  • -outform DER|PEM

    输出CSR格式,无默认值

  • -in filename

    输入文件的位置,默认为std input,除非指定了-x509 or -CA。也就是说-x509或-CA必须通过-in选项从文件读取公钥
    只有未指定创建选项时 (-new or -newkey or -precert) 才会读取证书请求.
    req命令是用来生成证书请求的,-in参数有什么用呢?共实req命令不光能生成证书请求还能读取和验证证书请求,以及根据证书请求签署证书,这时候就需要-in参数。

  • -sigopt nm:v

    指定签名算法

  • -vfyopt nm:v

    验证签名时指定签名算法的选项,不同的签名算法选项也不同

  • -passin arg

    输入文件的密码来源,可以是pass:password,env:var,file:pathname,fd:number,stdin

  • -passout arg

    输出文件的密码来源

  • -out filename

    输出文件名,通常是证书请求或证书(-x509或-ca)

  • -text

    打印csr的内容到屏幕上并且后面跟CSR正文,当指定-out参数时则是写入到文件中

    用法如下:
    openssl req -in ca.csr -text

  • -subject

    打印CSR的subject到屏幕上

  • -noout

    阻止输出CSR正文,当不指定-text都打印参数时则什么也不输出,指定-text参数时只会输出text。

  • -modulus

    打印csr的公钥模数

  • -verify

    验证csr中的自签名是否正确,如果失败立即退出,如果正确会显示Certificate request self-signature verify OK。

  • -new

    生成新的证书请求,它会提示输入相关字段的值。提示输入的字段在配置文件中指定。
    如果没有指定-key则根据配置文件生成私钥或者指定-newkey and -pkeyopt选项,否者会使用2048位的RSA私钥。

  • -newkey arg

    指定生成私钥的参数
    在没有指定-key的时候用于生成私钥,可以与-new一起使用创建csr,也可以与-x509一起使用来创建证书。
    arg参数有一下几种格式:

    • [rsa:]nbits

      指定rsa算法及位数,rsa是可选的

    • param:file

      指定参数文件,只有dsa,dh,dhx,ec算法支持参数文件。

    • algname[:file]

      指定具体算法和参数文件,只有dsa,dh,dhx,ec算法支持参数文件

    • dsa:filename

      指定dsa算法和参数文件

    • ec:filename

      指定ec算法和参数文件。

    • gost2001:filename

      指定gost2001算法和参数文件,gost是俄罗斯政府推出的签名算法。

    参数文件是用openssl genpkey命令生成的,对于dsa,dh,dhx算法,参数文件已经包含了私钥的各种参数值,对于ec算法,参数文件就是曲线的OID标识符,可以是各种类型的曲线。当不指定参数文件时可以通过-pkeyopt指定算法参数

  • -pkeyopt opt:value

    如果有多个参数可以指定多次,参数的具体值参考openssl genpkey命令

  • -key filename|uri

    指定私钥文件,用于签名新的证书或证书请求。如果不指定-in的话会把-key指定的私钥的公钥放入证书或证书请求中形成自签名证书或证书请求。
    指定-CA选项时这个这个选项会被覆盖(-CA可以生成非自签名证书)

  • -keyform DER|PEM|P12|ENGINE

    私钥的格式

  • -keyout filename

    写入私钥到指定的文件名,私钥可以是-newkey创建的,也可以是-key读入的。如果生成了新私钥且未指定-keyout则会输出到标准输出。如果-keyout和-key选项都没有指定则使用配置文件中的default_keyfile选项,如果存在的话。(If neither the -keyout option nor the -key option are given then the filename specified in the configuration file with the default_keyfile option is used, if present.)。

  • -noenc

    不加密私钥

  • -nodes

    已废弃,同-noenc

  • -digest

    签名用的摘要算法,只要是openssl dgst支持的算法都可以,会覆盖配置文件中指定的摘要算法。一些公钥算法只支持特定的摘要算法,这个选项不生效。例如DSA仅支持SHA1。

  • -config

    指定备用的配置文件,用于替代默认的openssl.cnf

  • -section name

    指定该命令的section name,默认是req

  • -subj arg

    指定主题的DN,arg的格式为/type0=value0/type1=value1/type2=...
    特殊字符用\转义,允许使用空格,单个/指定空的DN,可以用+代表/作为两个RDN之间的分隔符,例如/DC=org/DC=OpenSSL/DC=users/UID=123456+CN=John Doe,/C=CN/ST=Shanghai/L=Shanghai/CN=hetao/emailAddress=tao@hetao.me/

  • -multivalue-rdn

    废弃选项,不起作用

  • -x509

    使用这个选项时生成证书而不是证书请求,当指定-CA选项是-x509是默认指定的。
    使用-x509选项时如果没有指定-in选项则隐含包括-new选项。
    如果没有指定-CA则会生成自签名证书
    如果-in选项指定了证书请求则将其转换为证书,否者从头创建请书请求。(If an existing request is specified with the -in option, it is converted to a certificate; otherwise a request is created from scratch.)
    如果没有指定-set_serial则使用一个大随机数作为证书序列号
    除非使用 -copy_extensions 选项,否则不会从证书请求输入文件中复制 X.509 扩展。

    可以在配置文件中指定要添加的 X.509 扩展,可以使用 -config 和 -extensions 选项,和/或使用 -addext 选项指定配置文件。
    除非给出 -x509v1,否则生成的证书将带有 X.509 版本 3。除非另有说明,否则将包含密钥标识符扩展属性,如 x509v3_config(5) 中所述。也就是说密钥标识符是默认就包含的V3扩展。

  • -x509v1

    使用X509 V1版本,使用-x509时这是一个隐含选项。如果使用了扩展则一定会使用V3版本(也就是使用扩展时该选项不生效)。
    根据我测试的情况openssl3.2以上版本才有此选项,如果想使该选项生效需要指定extensions为空的openssl配置文件(默认配置是有extensions的)

  • -CA filename|uri

    指定签名用的CA证书,CA证书的subject DN会放入签署证书的issuer DN字段,并使用-CAkey指定的私钥生成签名。

  • -CAkey filename|uri

    签署证书的CA私钥,必须与-CA指定的证书中的公钥匹配,如果不指定则-CA指定的证书中必须包含私钥(If this option is not provided then the key must be present in the -CA input).

  • -not_before date

    证书生效的起始日期。格式是YYMMDDHHMMSSZYYYYMMDDHHMMSSZ,秒SS和时区Z是必须存在的,可以指定today

  • -not_after date

    证书的截止日期。格式是YYMMDDHHMMSSZYYYYMMDDHHMMSSZ,秒SS和时区Z是必须存在的,可以指定today,会覆盖 -days options。

  • -days n

    指定证书生效的天数。始终从今天开始算而不管-not_before的值,如果指定-not_after则-days不生效。n是正整 数,默认值为30天。

  • -set_serial n

    指定自签名证书的证书序列号,可以指定10进制数或以0x开头的16进制数。不指定的时候会使用一个大随机数。

  • copy_extensions arg

    确定如何处理证书请求中的扩展。如果设置为 none 或此选项不存在,则将忽略证书请求中的扩展,而不会将其复制到证书中。如果设置为 copy,则请求中存在但尚未存在的任何扩展都将复制到证书中。如果设置为 copyall,则请求中的所有扩展都将复制到证书中:如果扩展已存在于证书中,则首先将其删除。

  • -extensions section, -reqexts section

    用于覆盖生成证书请求或证书时X.509 V3扩展的section name,允许使用多次。

-reqexts是-extensions的别名
– -addext ext

添加一个指定的V3扩展属性到证书或证书请求中。ext的格式是`key=value`,这个选项可以指定多次,但是扩展的`key`(不是密钥,是键)不能重复使用.
如果指定的key与配置文件中的扩展OID相同则会覆盖配置文件中的值(每个key都有一个oid)。
  • -precert

    生成一个预证书,这个预计书会推带一个poison extension扩展,然后把这个预证书提交到SCT服务器,然后从SCT服务器返回SCT,然后SCT可以包含到最终签发的证书或配置到http服务器上。
    poison扩展是RFC6962定义的一个扩展(不同于X.509 V3),现已被废弃。新的RFC 9162(Certificate Transparency Version 2.0)不再使用这个扩展。
    这个是为了支持google的Certificate Transparency计划,确保CA签署的证书不被篡改并对CA签署的的所有证书进行公示,避免CA乱发证书。
    这个选项已经隐含了-new选项。

    国内厂商开发了支技国密算法的证书透明(基于RFC6962),详见:https://zotrus.com/blog/what-is-certificate-transparency_what-is-sm2-certificate-transparency.html
    其实CT V2.0已经支持所有在IANA注册的TLS SignatureScheme签名Log,https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-signaturescheme

    在线的SCT日志查询网站:
    https://myssl.com/ct_check.html
    https://ctlogsearch.com/searchdomainname
    chrome自2018年开始要求所有证书支持SCT

  • -utf8

    所有字段值都用utf-8编码解释(默认是ASCII),无论是来自终端还是配置文件的字段。

  • -reqopt option

    自定义-text 输出的格式,可以豆号分隔多个选项也可以指定多次-reqopt。option的值参见:https://docs.openssl.org/3.4/man1/openssl-x509/#text-printing-flags

  • -newhdr

    在输出的证书请求文件的行和尾添加”NEW”,某些CA和软件需要。添加后BEGIN变成BEGIN NEW

  • -batch

    非交互模式

  • -verbose

    执行时输出更多的信息

  • -quiet

    输出更少的信息,这在批处理和使用管道时很方便,尤其是密钥生成期间抑制进度.的输出。

  • -keygen_engine id

    指定生成密钥的engine

  • -nameopt option

    指定如何显示subject和issuer中的DN,具体参考:https://docs.openssl.org/3.4/man1/openssl-namedisplay-options/#name-format-option-arguments

  • -rand files, -writerand file

    指定随机数状态保存的文件,读取之前的随机数生成器状态并写入当前状态用于下次执行的时候继续使用。现在OpenSSL已经从操作系统中读取熵源,这个选项不再需要,只是在特殊情况下才有用。

  • -engine id

    指定engine id,这个选项已经废弃

  • -provider name

    指定provider name

  • -provider-path path

    provider的路径

  • -propquery propq

    provider中的属性

配置文件格式

配置选项是在配置文件的req section中指定的,也可以用-section指定备用section name,如果section中没有指定值则也会在配置文件的default section中搜索。(As with all configuration files, if no value is specified in the specific section then the initial unnamed or default section is searched too.这句话说的有歧议,经过我反复测试,这句话的真正意思是如果指定的section中没有的属性也会在default section去查找,value应该是setcion中的filed或property, 而the specific section指的是默认的req section或用-section指定的其它section,也就是说default section中的配置是对所有命令都有效的)
比如这样配置(把req section的字段都移到了default section):

config_diagnostics = 1
openssl_conf = openssl_init
default_bits        = 4096
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
attributes      = req_attributes
x509_extensions = v3_ca # The extensions to add to the self signed cert
[ req ]
... 移到了上面 ...
[ openssl_init ]
oid_section = oids
providers = providers
alg_section = evp_properties
ssl_conf = ssl_configuration
engines = engines
random = random
  • input_password, output_password

    读取和写入私钥的加密密码,对应-passin和-passout选项

  • default_bits

    指定rsa密钥的位数

  • default_keyfile

    私钥文件的输出位置,对应-keyout选项

  • oid_file

    oid定义文件,每行一个

  • oid_section

    指定定义oid的section

  • RANDFILE

    对应-rand files选项

  • encrypt_key

    加密私钥的密码,对应-encrypt_rsa_key

  • default_md

    指定摘要算法,对应-digest

  • string_mask

    指定允许的字符串编码

    • utf8only

      only UTF8Strings are used (this is the default value)

    • pkix

      any string type except T61Strings

    • nombstr

      any string type except BMPStrings and UTF8Strings

    • default

      any kind of string type

    utf8only是默认值,如果遇到不兼容utf8的软件可以指定nombstr

  • req_extensions

    包含在证书请求中的X.509 V3扩展,对应-reqexts (or -extensions)选项

  • x509_extensions

    包含在证书中的X.509 V3扩展,对应-reqexts (or -extensions)选项

  • prompt

    yes or no
    设为no的时候从文件读取而不是从终端读取DN信息
    会影响distinguished_name或attributes的格式。

  • utf8

    yes or no
    对应-utf8

  • attributes

    这个section包含任何需要终端输入的属性
    其格式与 distinguished_name 相同。通常,这些可能包含 challengePassword 或 unstructuredName 类型。它们目前被 OpenSSL req命令忽略,但一些 CA 可能需要它们。
    ${attributes}_default可以指定属性的默认值

  • distinguished_name

    生成证书或证书请求的DN信息,${distinguished_name}_default可以指定默认的DN信息

    配置文件示例

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

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

    stateOrProvinceName = State or Province Name (full name)
    stateOrProvinceName_default = Shanghai

    localityName = Locality Name (eg, city)
    localityName_default = Shanghai

    0.organizationName = Organization Name (eg, company)
    0.organizationName_default = Hangshu

    <h1>we can do this but it is not needed normally :-)</h1>

    <h1>1.organizationName = Second Organization Name (eg, company)</h1>

    <h1>1.organizationName_default = World Wide Web Pty Ltd</h1>

    organizationalUnitName = Organizational Unit Name (eg, section)
    organizationalUnitName_default = R&D

    commonName = Common Name (e.g. server FQDN or YOUR name)
    commonName_default = t.he
    commonName_max = 64

    emailAddress = Email Address
    emailAddress_default = t.he@hang-shu.com
    emailAddress_max = 64

    [ req_attributes ]
    challengePassword = A challenge password

    “`

DISTINGUISHED NAME AND ATTRIBUTE SECTION FORMAT

DISTINGUISHED NAME和attribute sections(应该指的是定义DN的section)有两种不同的格式(根据prompt选项)。如果将prompt选项设置为否,则这些部分仅由field names and values组成:例如,

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

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

实际允许的字段名称是任何object identifier短名称或长名称。这些名称被编译到 OpenSSL 中,包括常用值,例如 commonName、countryName、localityName、organizationName、organizationalUnitName、stateOrProvinceName。此外,还包括 emailAddress 以及 name、surname、givenName、initials 和 dnQualifier。
关于这些DN中的RDN值的object identifier及短/长名称,可以通过命令openssl list -objects| grep "2\.5\.4"查看,不过这样看的不完整,也可以通过微软的这个文档查看名称属性

可以使用配置文件中的 oid_file 或 oid_section 选项定义附加object identifiers。任何附加字段都将被视为 DirectoryString。

Views: 0

评论

发表回复