openssl req 详解

一、openssl req

该命令用于创建和处理PKCS#10格式的证书请求(certificate requests CSRs),也可以用来创建自签名证书( self-signed certificates)来当作根证书(root CAs)使用

-new 该选项用来生成一个新的证书请求(certificate request),它将提示用户输入相关的字段值。

如果没有指定-key选项,则会使用配置文件中的默认信息自动生成一个私钥以及证书请求文件;或者可以指定 -newkey和 -pkeyopt 两个选项用来指定生成的私钥类型
-out filename 指定输出文件名,如果不指定则输出到 标准输出
-key filename|uri 生成一个证书请求或者签名一个证书需要使用到私钥,该选项
-in filename 这指定了要从中读取证书请求的输入文件名。仅当未指定创建选项(-new 或 -newkey 或 -precert)时,才会只读取请求。
-x509 指定此选项的话,输出的就是一个证书文件而不是证书请求文件
-keyout filename 指定自动生成的私钥文件名,或者从-key中指定的文件名,如果 -keyout 和 -key 选项都没有被提供,则会使用配置文件中的default_keyfile选项,如果上述选项都没有配置,则会输出到标准输出
-config filename 指定配置文件路径
-CA filename|uri 指定 "CA" 证书用于对其他证书进行签名(即对证书请求文件的相关内容进行签名生成一个新的证书),使用此选项,意味着包含了-x509选项
-CAkey filename|uri 使用CA证书对其他证书签名的时候需要指定该CA证书的私钥
-inform DER|PEM 指定输入CSR文件的编码格式,默认情况是PEM格式
-outform DER|PEM 指定输出CSR文件的编码格式,默认情况下不指定
-text 以text的格式输出CSR文件
-pubkey输出CSR文件中对应的公钥信息
-passout arg 指定输出文件的密码,一般用于指定生成key的密码
-passin arg 用于指定输入私钥文件或者证书、证书请求的密码
-newkey arg 当CSR生成命令没有使用-key指定一个具体的私钥的时候,会使用默认配置生成一个私钥,但是也可以使用-newkey arg选项自定义输出一个私钥

该选项同时包含了-new选项去生成一个CSR文件或者证书文件(证书文件需要同时指定-x509选项)。

arg选项如下:
-config filename 用于指定配置文件
-section name 指定配置文件中的section,默认式req
-verify 用于验证CSR自签名是否能成功,如果失败立即退出,并且不会打印信息,如果成功会打印如下字样:

Certificate request self-signature verify OK
-subj arg 用于设置证书请求文件的主题项(subject) -subj "/C=GB/CN=foo"
-not_before date 设置证书的生效时间 当-x509选项被指定的时候,该选项才会被允许使用,格式是 YYMMDDHHMMSSZ或者YYYYMMDDHHMMSSZ 或者 today
-not_after date 设置证书的到期时间 当-x509选项被指定的时候,该选项才会被允许使用,格式是 YYMMDDHHMMSSZ或者YYYYMMDDHHMMSSZ 或者 today
-days n 用于指定证书从今天开始的到期天数,n是一个正整数,默认是30天;当设置此值的时候不需要关注not_before,因为是从今天开始;当not_after此值被设置的时候,会覆盖掉-days选项的值,即-not_after 与 -days同时存在的时候, -not_after生效。

二、命令实例详解

  • 1、生成一个CSR文件,并且同时生成一个私钥文件
bash 复制代码
openssl req -new -keyout myprivkey.pem  -out mycsr.pem

上述命令再生成csr文件的同时也会生成一个私钥,一般情况下私钥需要使用加密算法+密码进行加密,所以会有提示让你输入密码,如果不想交互式的输入密码,可以使用-passout pass:mima选项

bash 复制代码
Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

在默认配置中,也会要求对输出的CSR文件进行加密,所以也会提升输入密码,如果不想要密码,可以再配置文件中进行修改

bash 复制代码
A challenge password []:
  • 2、使用存在的证书文件生成一个证书请求文件
bash 复制代码
 openssl req -new -key myprivkey1.pem  -out mycsr1.pem

如果私钥文件有密码,则会交互式的输入密码,如果不想交互式的输入密码,可以使用-passin pass:mima选项输入密码

  • 3、生成一个证书,该证书是自签名根证书( self-signed root certificate)
bash 复制代码
openssl req -new -keyout myprivkey1.pem  -x509 -out mycertificate.pem

如果想要生成一个证书文件,必须要指定-x509 选项,密码以及私钥策略同上

  • 4、检查和验证证书请求文件的正确性
bash 复制代码
 openssl req -in .\mycsr.pem -verif
  • 5、使用CA证书签名CSR文件,生成一个对应的新证书以及生成一个对应的私钥
bash 复制代码
openssl req -CA mycertificate.pem  -CAkey myprivkey.pem  -out testcert.pem

上述命令会自动生成一个私钥,以及由CA证书签名的证书

-CA选项用于指定CA根证书,CAkey用于指定CA对应的私钥,-CA选项通常包含-x509选项,而-x509又包含-new选项,所以上述命令有自动生成的含义

  • 6、使用CA证书签名CSR文件,生成一个对应的新证书
bash 复制代码
openssl req -CA mycertificate.pem  -CAkey myprivkey.pem -in mycsr.pem -out testcert2.pem

上述命令对已有的CSR文件进行签名,如果不指定-in选项,会自动(如果不指定in选项,会默认包含-new选项)生成一个私钥(该私钥需要交互式输入密码,如果不想交互式的输入密码需要指定-passout选项)以及对应的证书文件

三、配置文件

1、req的配置文件,用于存储一些配置字段以及需要交互式输入的字段

bash 复制代码
[ 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

2、默认配置文件示例

bash 复制代码
[ 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

注意

一个证书请求文件一般需要包含一个公钥以及如下信息:

java 复制代码
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:

但是在实际命令中通常是需要输入一个私钥,然后从私钥中提取公钥以及其他相关信息再配合上述信息共同组成证书请求文件。

相关推荐
许野平9 天前
OpenSSL:生成 DER 格式的 RSA 密钥对
服务器·网络·openssl·rsa·pem·der
Xnah_9 天前
ubuntu 20.4 安装 openssl 3.x
ubuntu·openssl
redwingz15 天前
openssl签名报错
openssl·random
Anlige25 天前
PHP实现OPENSSL的EVP_BytesToKey
开发语言·php·openssl·evp
cooldream20091 个月前
升级 OpenSSL 的详细步骤(解决 SSH 漏洞的前提)
运维·ssh·openssl
年薪丰厚1 个月前
如何手动安装libcrypto.so.10和libssl.so.10这两个库?
openssl·libcrypto.so.10·libssl.so.10
恋喵大鲤鱼2 个月前
openssl(1) command
openssl
pzs02212 个月前
openssl的使用
openssl
小亦小亦_空中接力2 个月前
openssl+keepalived安装部署
openssl·keepalived
摸鱼手会滑2 个月前
源码编译安装python3.12没有ssl模块,python3.12 ModuleNotFoundError: No module named ‘_ssl‘
ssl·openssl·python3