openssl簡(jiǎn)介(十八)--指令req
十八.????
指令
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]
? ?
? ???
描述
:
? ?
本指令用來(lái)創(chuàng)建和處理
PKCS#10
格式的證書
.
它還能夠建立自簽名證書
,
做
Root CA.
? ?? ?? ?
? ? OPTIONS
? ? -inform DER|PEM
? ?
指定輸入的格式是
DEM
還是
DER. DER
格式采用
ASN1
的
DER
標(biāo)準(zhǔn)格式。一般用的多的都是
PEM
格式,就是
base64
編碼格式
.
你去看看你做出來(lái)的那些
.key, .crt
文件一般都是
PEM
格式的,第一行和最后一行指明內(nèi)容,中間就是經(jīng)過(guò)編碼的東西。
? ? -outform DER|PEM
? ?
和上一個(gè)差不多,不同的是指定輸出格式
? ? -in filename
? ?
要處理的
CSR
的文件名稱
,
只有
-new
和
-newkey
倆個(gè)
option
沒(méi)有被
set,
本
option
才有效
? ? -passin arg
? ?
去看看
CA
那一章關(guān)于這個(gè)
option
的解釋吧。
? ???-out filename
? ?
要輸出的文件名
? ? -passout arg
? ?
參看
dsa
指令里的
passout
這個(gè)
option
的解釋吧
.
? ?-text
? ?
將
CSR
文件里的內(nèi)容以可讀方式打印出來(lái)
? ? -noout
? ?
不要打印
CSR
文件的編碼版本信息
.
? ? -modulus
? ?
將
CSR
里面的包含的公共米要的系數(shù)打印出來(lái)
.
? ? -verify
? ?
檢驗(yàn)請(qǐng)求文件里的簽名信息
.
? ? -new
? ?
本
option
產(chǎn)生一個(gè)新的
CSR,
它會(huì)要用戶輸入創(chuàng)建
CSR
的一些必須的信息
.
至于需要哪些信息
,
是在
config
文件里面定義好了的
.
如果
-key
沒(méi)有被
set,
那么就將根據(jù)
config
文件里的信息先產(chǎn)生一對(duì)新的
RSA
密鑰
? ? -rand file(s)
? ?
產(chǎn)生
key
的時(shí)候用過(guò)
seed
的文件,可以把多個(gè)文件用冒號(hào)分開(kāi)一起做
seed.
? ? -newkey arg
? ?
同時(shí)生成新的私有密鑰文件和
CSR
文件
.
本
option
是帶參數(shù)的
.
如果是產(chǎn)生
RSA
的私有密鑰文件
,
參數(shù)是一個(gè)數(shù)字
,
指明私有密鑰
bit
的長(zhǎng)度
.
如果是產(chǎn)生
DSA
的私有密鑰文件
,
參數(shù)是
DSA
密鑰參數(shù)文件的文件名
.
? ? -key filename
? ?
參數(shù)
filename
指明我們的私有密鑰文件名
.
允許該文件的格式是
PKCS#8.
? ? -keyform DER|PEM
? ?
指定輸入的私有密鑰文件的格式是
DEM
還是
DER. DER
格式采用
ASN1
的
DER
標(biāo)準(zhǔn)格式。一般用的多的都是
PEM
格式,就是
base64
編碼格式
.
你去看看你做出來(lái)的那些
.key, .crt
文件一般都是
PEM
格式的,第一行和最后一行指明內(nèi)容,中間就是經(jīng)過(guò)編碼的東西。
? ? -outform DER|PEM
? ?
和上一個(gè)差不多,不同的是指定輸出格式
? ? -keyform PEM|DER
? ?
私有密鑰文件的格式
,
缺省是
PEM
? ? -keyout filename
? ?
指明創(chuàng)建的新的私有密鑰文件的文件名
.
如果該
option
沒(méi)有被
set,
將使用
config
文件里面指定的文件名
.
? ? -nodes
? ?
本
option
被
set
的話
,
生成的私有密鑰文件將不會(huì)被加密
.
? ? -[md5|sha1|md2|mdc2]
? ?
指明簽發(fā)的證書使用什么哈希算法
.
如果沒(méi)有被
set,
將使用
config
文件里的相應(yīng)
item
的設(shè)置
.
但
DSA
的
CSR
將忽略這個(gè)
option,
而采用
SHA1
哈希算法
.
? ? -config filename
? ?
使用的
config
文件的名稱
.
本
option
如果沒(méi)有
set,
將使用缺省的
config
文件
.
? ? -x509
? ?
本
option
將產(chǎn)生自簽名的證書
.
一般用來(lái)錯(cuò)測(cè)試用
,
或者自己玩下做個(gè)
Root CA.
證書的擴(kuò)展項(xiàng)在
config
文件里面指定
.
? ?-days n
? ?
如果
-509
被
set,
那么這個(gè)
option
的參數(shù)指定我們自己的
CA
給人家簽證書的有效期
.
缺省是
30
天
.
? ? -extensions section -reqexts section
? ?
這倆個(gè)
option
指定
config
文件里面的與證書擴(kuò)展和證書請(qǐng)求擴(kuò)展有關(guān)的倆個(gè)
section
的名字
(
如果
-x509
這個(gè)
option
被
set).
這
樣你可以在
config
文件里弄幾個(gè)不同的與證書擴(kuò)展有關(guān)的
section,
然后為了不同的目的給
CSR
簽名的時(shí)候指明不同的
section
來(lái)控制簽名的行為
.
? ? -asn1-kludge
? ?
缺省的
req
指令輸出完全符合
PKCS10
格式的
CSR,
但有的
CA
僅僅接受一種非正常格式的
CSR,
這個(gè)
option
的
set
就可以輸出那種格式的
CSR.
要解釋這倆種格式有點(diǎn)麻煩
,
需要用到
ASN1
和
PKCS
的知識(shí)
,
而且現(xiàn)在這樣子怪的
CA
幾乎沒(méi)有
,
所以省略解釋
? ? -newhdr
? ?
在
CSR
問(wèn)的第一行和最后一行中加一個(gè)單詞
"NEW",
有的軟件
(netscape certificate server)
和有的
CA
就有這樣子的怪癖嗜好
.
如果那些必須要的
option
的參數(shù)沒(méi)有在命令行給出,那么就會(huì)到
config
文件里去查看是否有缺省
值,
然后時(shí)候。
config
文件中相關(guān)的一些
KEY
的解釋與本指令有關(guān)的
KEY
都在
[req]
這個(gè)
section
里面
.
? ? input_password output_password
? ?
私有密鑰文件的密碼和把密碼輸出的文件名
.
同指令的
passin, passout
的意義相同
.
? ? default_bits
? ?
指定產(chǎn)生的私有密鑰長(zhǎng)度
,
如果為空
,
那么就用
512.
只有
-new
被
set,
這個(gè)設(shè)置才起作用
,
意義同
-newkey
相同
.
? ? default_keyfile
? ?
指定輸出私有密鑰文件名
,
如果為空
,
將輸出到標(biāo)準(zhǔn)輸入
,
意義同
-keyout
相同
.
? ? oid_file
? ? oid_section
? ?
與
oid
文件有關(guān)的項(xiàng)
, oid
不清楚是什么東西來(lái)的
.
? ? RANDFILE
? ?
產(chǎn)生隨機(jī)數(shù)字的時(shí)候用過(guò)
seed
的文件,可以把多個(gè)文件用冒號(hào)分開(kāi)一起做
seed.
? ? encrypt_key
? ?
如果本
KEY
設(shè)置為
no,
那么如果生成一個(gè)私有密鑰文件
,
將不被加密
.
同命令行的
-nodes
的意義相同
.
? ? default_md
? ?
指定簽名的時(shí)候使用的哈希算法
,
缺省為
MD5.
命令行里有同樣的功能輸入
.
? ? string_mask
? ?
屏蔽掉某些類型的字符格式
.
不要亂改這個(gè)
KEY
的值
!!
有的字符格式
netscape
不支持
,
所以亂改這個(gè)
KEY
很危險(xiǎn)
.
? ? req_extensions
? ?
指明證書請(qǐng)求擴(kuò)展
section,
然后由那個(gè)
secion
指明擴(kuò)展的特性
. openssl
的缺省
config
文件里
,
擴(kuò)展的是
X509v3,
不擴(kuò)展的是
x509v1.
這個(gè)
KEY
的意義和命令行里
-reqexts
相同
.
? ? x509_extensions
? ?
同命令行的
-extension
的意義相同
.
指明證書擴(kuò)展的
sesion,
由那個(gè)
section
指明證書擴(kuò)展的特性
.
? ? prompt
? ?
如果這個(gè)
KEY
設(shè)置為
no,
那么在生成證書的時(shí)候需要的那些信息將從
config
文件里讀入
,
而不是從標(biāo)準(zhǔn)輸入由用戶去輸入
,
同時(shí)改變下倆個(gè)
KEY
所指明的
section
的格式
.
? ? attributes
? ?
一個(gè)過(guò)時(shí)了的東西
,
不知道也罷
.
不過(guò)它的意義和下一個(gè)
KEY
有點(diǎn)類似
,
? ?
格式則完全相同
.
distinguished_name
? ?
指定一個(gè)
section,
由那個(gè)
section
指定在生成證書或者
CRS
的時(shí)候需要的資料
.
該
section
的格式如下
:
? ?
其格式有倆種
,
如果
KEY prompt
被
set
成
no(
看看
prompt
的解釋
),
那么這個(gè)
secion
的格式看起來(lái)就是這樣子的
:
? ???CN=My Name
? ? OU=My Organization
? ? emailAddress=someone@somewhere.org
? ?
就說(shuō)只包括了字段和值。這樣子可以可以讓其他外部程序生成一個(gè)摸板文件
,
包含所有字段和值
,
把這些值提出來(lái)
.
等下舉例時(shí)間會(huì)有詳細(xì)說(shuō)明
.
如果
prompt
沒(méi)有被
set
成
no,
那么這個(gè)
section
的格式則如下
:
? ? fieldName="please input ur name"
? ?
? ???fieldName_default="fordesign"
? ?
? ???fieldName_min= 3
? ?
? ???fieldName_max= 18
? ?
? ? "fieldname"
就是字段名
,
比如
commonName(
或者
CN). fieldName(
本例中是
"prompt"
? ?
用戶輸入的字節(jié)數(shù)必須在
fieldName_min
和
fieldName_max
之間
.
不同的
section
還可能對(duì)輸入的字符有特殊規(guī)定
,
比如必須是可打印字符
.
那么在本例里面
,
程序的表現(xiàn)將如下
:
? ?
首先把
fieldName
打印出來(lái)給用戶以提示
? ? please input ur name:
? ?
之后如果用戶必須輸入
3
到
18
之間的一個(gè)長(zhǎng)度的字符串
,
如果用戶什么也不輸入
,
那么就把
fieldName_default
里面的值
"fordesign"
作為該字段的值添入
.
? ?
有的字段可以被重復(fù)使用
.
這就產(chǎn)生了一個(gè)問(wèn)題
, config
文件是不允許同樣的
section
文件里面有多于一個(gè)的相同的
key
的
.
其實(shí)這很容易解決
,
比如把它們的名字分別叫做
"1.organizationName", "2.organizationName"
? ? openssl
在編譯的時(shí)候封裝了最必須的幾個(gè)字段,
比如
commonName, countryName, localityName, organizationName,organizationUnitName, stateOrPrivinceName
還增加了
emailAddress surname, givenName initials
和
dnQualifier.
? ?
舉例時(shí)間
:
? ?
就使用確省值
.
如果沒(méi)有缺省值
,
那么該字段被忽略
.
用戶如果輸入
'.' ,
也可以讓該字段被忽略
.
用戶輸入的字節(jié)數(shù)必須在
fieldName_min
和
fieldName_max
之間
.
不同的
section
還可能對(duì)輸入的字符有特殊規(guī)定
,
比如必須是可打印字符
.
那么在本例里面
,
程序的表現(xiàn)將如下
:
? ?
首先把
fieldName
打印出來(lái)給用戶以提示
? ? please input ur name:
? ?
之后如果用戶必須輸入
3
到
18
之間的一個(gè)長(zhǎng)度的字符串
,
如果用戶什么也不輸入
,
那么就把
fieldName_default
里面的值
"fordesign"
作為該字段的值添入
.
? ?
有的字段可以被重復(fù)使用
.
這就產(chǎn)生了一個(gè)問(wèn)題
, config
文件是不允許同樣的
section
文件里面有多于一個(gè)的相同的
key
的
.
其實(shí)這很容易解決
,
比如把它們的名字分別叫做
"1.organizationName", "2.organizationName" openssl
在編譯的時(shí)候封裝了最必須的幾個(gè)字段,比如
commonName,countryName,localityName, organizationName,organizationUnitName, stateOrPrivinceName
還增加了
emailAddress surname, givenName initials
和
dnQualifier.
? ?
舉例時(shí)間
:
? ? Examine and verify certificate request:
? ?
檢查和驗(yàn)證
CSR
文件
.
? ? openssl req -in req.pem -text -verify -noout
? ?
做自己的私有密鑰文件
,
然后用這個(gè)文件生成
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
? ?
做一個(gè)自簽名的給
Root CA
用的證書
:
? ? openssl req -x509 -newkey rsa:1024 -keyout key.pem -out crt.pem
? ?
下面是與本指令有關(guān)的
config
文件中相關(guān)的部分的一個(gè)例子
:
? ? [ 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
文件的開(kāi)頭和結(jié)尾一行如下
? ? -----BEGIN CERTIFICATE REQUEST----
? ? -----END CERTIFICATE REQUEST----
? ?
但個(gè)把變態(tài)軟件和
CA
硬是需要
CSR
的文件要這樣子
:
? ? -----BEGIN NEW CERTIFICATE REQUEST----
? ? -----END NEW CERTIFICATE REQUEST----
? ?
用
-newhdr
就可以啦
,
或者你自己手工加也中
.openssl
對(duì)倆種格式都承認(rèn)
.
? ? openssl
的
config
文件也可以用環(huán)境變量
OPENSSL_CONF
或者
SSLEAY_CONF
來(lái)指定
.
posted on 2006-10-17 15:41 捕風(fēng) 閱讀(835) 評(píng)論(0) 編輯 收藏 所屬分類: java安全