?
十八.????
指令
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
來指定
.
?