十八.
指令
req
用法
:
openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename]
[-passin arg] [-out filename] [-passout arg] [-text] [-noout]
[-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa]
[-newkey dsa] [-nodes] [-key filename] [-keyform PEM|DER]
[-keyout filename] [-[md5|sha1|md2|mdc2]] [-config filename]
[-x509] [-days n] [-asn1-kludge] [-newhdr] [-extensions section]
[-reqexts section]
描述
:
本指令用来创建和处理
PKCS#10
格式的证书
.
它还能够建立自签名证书
,
做
Root CA.
OPTIONS
-inform DER|PEM
指定输入的格式是
DEM
还是
DER. DER
格式采用
ASN1
的
DER
标准格式。一般用的多的都是
PEM
格式,就是
base64
编码格式
.
你去看看你做出来的那些
.key, .crt
文件一般都是
PEM
格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
-outform DER|PEM
和上一个差不多,不同的是指定输出格式
-in filename
要处理的
CSR
的文件名称
,
只有
-new
和
-newkey
俩个
option
没有被
set,
本
option
才有效
-passin arg
去看看
CA
那一章关于这个
option
的解释吧。
-out filename
要输出的文件名
-passout arg
参看
dsa
指令里的
passout
这个
option
的解释吧
.
-text
将
CSR
文件里的内容以可读方式打印出来
-noout
不要打印
CSR
文件的编码版本信息
.
-modulus
将
CSR
里面的包含的公共米要的系数打印出来
.
-verify
检验请求文件里的签名信息
.
-new
本
option
产生一个新的
CSR,
它会要用户输入创建
CSR
的一些必须的信息
.
至于需要哪些信息
,
是在
config
文件里面定义好了的
.
如果
-key
没有被
set,
那么就将根据
config
文件里的信息先产生一对新的
RSA
密钥
-rand file(s)
产生
key
的时候用过
seed
的文件,可以把多个文件用冒号分开一起做
seed.
-newkey arg
同时生成新的私有密钥文件和
CSR
文件
.
本
option
是带参数的
.
如果是产生
RSA
的私有密钥文件
,
参数是一个数字
,
指明私有密钥
bit
的长度
.
如果是产生
DSA
的私有密钥文件
,
参数是
DSA
密钥参数文件的文件名
.
-key filename
参数
filename
指明我们的私有密钥文件名
.
允许该文件的格式是
PKCS#8.
-keyform DER|PEM
指定输入的私有密钥文件的格式是
DEM
还是
DER. DER
格式采用
ASN1
的
DER
标准格式。一般用的多的都是
PEM
格式,就是
base64
编码格式
.
你去看看你做出来的那些
.key, .crt
文件一般都是
PEM
格式的,第一行和最后一行指明内容,中间就是经过编码的东西。
-outform DER|PEM
和上一个差不多,不同的是指定输出格式
-keyform PEM|DER
私有密钥文件的格式
,
缺省是
PEM
-keyout filename
指明创建的新的私有密钥文件的文件名
.
如果该
option
没有被
set,
将使用
config
文件里面指定的文件名
.
-nodes
本
option
被
set
的话
,
生成的私有密钥文件将不会被加密
.
-[md5|sha1|md2|mdc2]
指明签发的证书使用什么哈希算法
.
如果没有被
set,
将使用
config
文件里的相应
item
的设置
.
但
DSA
的
CSR
将忽略这个
option,
而采用
SHA1
哈希算法
.
-config filename
使用的
config
文件的名称
.
本
option
如果没有
set,
将使用缺省的
config
文件
.
-x509
本
option
将产生自签名的证书
.
一般用来错测试用
,
或者自己玩下做个
Root CA.
证书的扩展项在
config
文件里面指定
.
-days n
如果
-509
被
set,
那么这个
option
的参数指定我们自己的
CA
给人家签证书的有效期
.
缺省是
30
天
.
-extensions section -reqexts section
这俩个
option
指定
config
文件里面的与证书扩展和证书请求扩展有关的俩个
section
的名字
(
如果
-x509
这个
option
被
set).
这
样你可以在
config
文件里弄几个不同的与证书扩展有关的
section,
然后为了不同的目的给
CSR
签名的时候指明不同的
section
来控制签名的行为
.
-asn1-kludge
缺省的
req
指令输出完全符合
PKCS10
格式的
CSR,
但有的
CA
仅仅接受一种非正常格式的
CSR,
这个
option
的
set
就可以输出那种格式的
CSR.
要解释这俩种格式有点麻烦
,
需要用到
ASN1
和
PKCS
的知识
,
而且现在这样子怪的
CA
几乎没有
,
所以省略解释
-newhdr
在
CSR
问的第一行和最后一行中加一个单词
"NEW",
有的软件
(netscape certificate server)
和有的
CA
就有这样子的怪癖嗜好
.
如果那些必须要的
option
的参数没有在命令行给出,那么就会到
config
文件里去查看是否有缺省
值,
然后时候。
config
文件中相关的一些
KEY
的解释与本指令有关的
KEY
都在
[req]
这个
section
里面
.
input_password output_password
私有密钥文件的密码和把密码输出的文件名
.
同指令的
passin, passout
的意义相同
.
default_bits
指定产生的私有密钥长度
,
如果为空
,
那么就用
512.
只有
-new
被
set,
这个设置才起作用
,
意义同
-newkey
相同
.
default_keyfile
指定输出私有密钥文件名
,
如果为空
,
将输出到标准输入
,
意义同
-keyout
相同
.
oid_file
oid_section
与
oid
文件有关的项
, oid
不清楚是什么东西来的
.
RANDFILE
产生随机数字的时候用过
seed
的文件,可以把多个文件用冒号分开一起做
seed.
encrypt_key
如果本
KEY
设置为
no,
那么如果生成一个私有密钥文件
,
将不被加密
.
同命令行的
-nodes
的意义相同
.
default_md
指定签名的时候使用的哈希算法
,
缺省为
MD5.
命令行里有同样的功能输入
.
string_mask
屏蔽掉某些类型的字符格式
.
不要乱改这个
KEY
的值
!!
有的字符格式
netscape
不支持
,
所以乱改这个
KEY
很危险
.
req_extensions
指明证书请求扩展
section,
然后由那个
secion
指明扩展的特性
. openssl
的缺省
config
文件里
,
扩展的是
X509v3,
不扩展的是
x509v1.
这个
KEY
的意义和命令行里
-reqexts
相同
.
x509_extensions
同命令行的
-extension
的意义相同
.
指明证书扩展的
sesion,
由那个
section
指明证书扩展的特性
.
prompt
如果这个
KEY
设置为
no,
那么在生成证书的时候需要的那些信息将从
config
文件里读入
,
而不是从标准输入由用户去输入
,
同时改变下俩个
KEY
所指明的
section
的格式
.
attributes
一个过时了的东西
,
不知道也罢
.
不过它的意义和下一个
KEY
有点类似
,
格式则完全相同
.
distinguished_name
指定一个
section,
由那个
section
指定在生成证书或者
CRS
的时候需要的资料
.
该
section
的格式如下
:
其格式有俩种
,
如果
KEY prompt
被
set
成
no(
看看
prompt
的解释
),
那么这个
secion
的格式看起来就是这样子的
:
CN=My Name
OU=My Organization
emailAddress=someone@somewhere.org
就说只包括了字段和值。这样子可以可以让其他外部程序生成一个摸板文件
,
包含所有字段和值
,
把这些值提出来
.
等下举例时间会有详细说明
.
如果
prompt
没有被
set
成
no,
那么这个
section
的格式则如下
:
fieldName="please input ur name"
fieldName_default="fordesign"
fieldName_min= 3
fieldName_max= 18
"fieldname"
就是字段名
,
比如
commonName(
或者
CN). fieldName(
本例中是
"prompt"
是用来提示用户输入相关的资料的
.
如果用户什么都不输
,
那么就使用确省值
.
如果没有缺省值
,
那么该字段被忽略
.
用户如果输入
'.' ,
也可以让该字段被忽略
.
用户输入的字节数必须在
fieldName_min
和
fieldName_max
之间
.
不同的
section
还可能对输入的字符有特殊规定
,
比如必须是可打印字符
.
那么在本例里面
,
程序的表现将如下
:
首先把
fieldName
打印出来给用户以提示
please input ur name:
之后如果用户必须输入
3
到
18
之间的一个长度的字符串
,
如果用户什么也不输入
,
那么就把
fieldName_default
里面的值
"fordesign"
作为该字段的值添入
.
有的字段可以被重复使用
.
这就产生了一个问题
, config
文件是不允许同样的
section
文件里面有多于一个的相同的
key
的
.
其实这很容易解决
,
比如把它们的名字分别叫做
"1.organizationName", "2.organizationName"
openssl
在编译的时候封装了最必须的几个字段,
比如
commonName, countryName, localityName, organizationName,organizationUnitName, stateOrPrivinceName
还增加了
emailAddress surname, givenName initials
和
dnQualifier.
举例时间
:
就使用确省值
.
如果没有缺省值
,
那么该字段被忽略
.
用户如果输入
'.' ,
也可以让该字段被忽略
.
用户输入的字节数必须在
fieldName_min
和
fieldName_max
之间
.
不同的
section
还可能对输入的字符有特殊规定
,
比如必须是可打印字符
.
那么在本例里面
,
程序的表现将如下
:
首先把
fieldName
打印出来给用户以提示
please input ur name:
之后如果用户必须输入
3
到
18
之间的一个长度的字符串
,
如果用户什么也不输入
,
那么就把
fieldName_default
里面的值
"fordesign"
作为该字段的值添入
.
有的字段可以被重复使用
.
这就产生了一个问题
, config
文件是不允许同样的
section
文件里面有多于一个的相同的
key
的
.
其实这很容易解决
,
比如把它们的名字分别叫做
"1.organizationName", "2.organizationName" openssl
在编译的时候封装了最必须的几个字段,比如
commonName,countryName,localityName, organizationName,organizationUnitName, stateOrPrivinceName
还增加了
emailAddress surname, givenName initials
和
dnQualifier.
举例时间
:
Examine and verify certificate request:
检查和验证
CSR
文件
.
openssl req -in req.pem -text -verify -noout
做自己的私有密钥文件
,
然后用这个文件生成
CSR
文件
.
openssl genrsa -out key.pem 1024
openssl req -new -key key.pem -out req.pem
也可以一步就搞定
:
openssl req -newkey rsa:1024 -keyout key.pem -out req.pem
做一个自签名的给
Root CA
用的证书
:
openssl req -x509 -newkey rsa:1024 -keyout key.pem -out crt.pem
下面是与本指令有关的
config
文件中相关的部分的一个例子
:
[ req ]
default_bits = 1024
default_keyfile = privkey.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
x509_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 = CA:true
RANDFILE = $ENV::HOME/.rnd
[ req ]
default_bits = 1024
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
一般的
PEM
格式的
CSR
文件的开头和结尾一行如下
-----BEGIN CERTIFICATE REQUEST----
-----END CERTIFICATE REQUEST----
但个把变态软件和
CA
硬是需要
CSR
的文件要这样子
:
-----BEGIN NEW CERTIFICATE REQUEST----
-----END NEW CERTIFICATE REQUEST----
用
-newhdr
就可以啦
,
或者你自己手工加也中
.openssl
对俩种格式都承认
.
openssl
的
config
文件也可以用环境变量
OPENSSL_CONF
或者
SSLEAY_CONF
来指定
.