openssl req 用于生成證書(shū)請(qǐng)求,以讓第三方權(quán)威機(jī)構(gòu)CA來(lái)簽發(fā),生成我們需要的證書(shū)。req 命令也可以調(diào)用x509命令,以進(jìn)行格式轉(zhuǎn)換及顯示證書(shū)文件中的text,modulus等信息。如果你還沒(méi)有密鑰對(duì),req命令可以一統(tǒng)幫你生成密鑰對(duì)和證書(shū)請(qǐng)求,也可以指定是否對(duì)私鑰文件進(jìn)行加密。
1、密鑰、證書(shū)請(qǐng)求、證書(shū)概要說(shuō)明
在證書(shū)申請(qǐng)簽發(fā)過(guò)程中,客戶(hù)端涉及到密鑰、證書(shū)請(qǐng)求、證書(shū)這幾個(gè)概念,初學(xué)者可能會(huì)搞不清楚三者的關(guān)系,網(wǎng)上有的根據(jù)后綴名來(lái)區(qū)分三者,更讓人一頭霧水。我們以申請(qǐng)證書(shū)的流程說(shuō)明三者的關(guān)系??蛻?hù)端(相對(duì)于CA)在申請(qǐng)證書(shū)的時(shí)候,大體上有三個(gè)步驟:
第一步:生成客戶(hù)端的密鑰,即客戶(hù)端的公私鑰對(duì),且要保證私鑰只有客戶(hù)端自己擁有。
第二步:以客戶(hù)端的密鑰和客戶(hù)端自身的信息(國(guó)家、機(jī)構(gòu)、域名、郵箱等)為輸入,生成證書(shū)請(qǐng)求文件。其中客戶(hù)端的公鑰和客戶(hù)端信息是明文保存在證書(shū)請(qǐng)求文件中的,而客戶(hù)端私鑰的作用是對(duì)客戶(hù)端公鑰及客戶(hù)端信息做簽名,自身是不包含在證書(shū)請(qǐng)求中的。然后把證書(shū)請(qǐng)求文件發(fā)送給CA機(jī)構(gòu)。
第三步:CA機(jī)構(gòu)接收到客戶(hù)端的證書(shū)請(qǐng)求文件后,首先校驗(yàn)其簽名,然后審核客戶(hù)端的信息,最后CA機(jī)構(gòu)使用自己的私鑰為證書(shū)請(qǐng)求文件簽名,生成證書(shū)文件,下發(fā)給客戶(hù)端。此證書(shū)就是客戶(hù)端的身份證,來(lái)表明用戶(hù)的身份。
至此客戶(hù)端申請(qǐng)證書(shū)流程結(jié)束,其中涉及到證書(shū)簽發(fā)機(jī)構(gòu)CA,CA是被絕對(duì)信任的機(jī)構(gòu)。如果把客戶(hù)端證書(shū)比作用戶(hù)身份證,那么CA就是頒發(fā)身份證的機(jī)構(gòu),我們以https為例說(shuō)明證書(shū)的用處。
為了數(shù)據(jù)傳輸安全,越來(lái)越多的網(wǎng)站啟用https。在https握手階段,服務(wù)器首先把自己的證書(shū)發(fā)送給用戶(hù)(瀏覽器),瀏覽器查看證書(shū)中的發(fā)證機(jī)構(gòu),然后在機(jī)器內(nèi)置的證書(shū)中(在PC或者手機(jī)上,內(nèi)置了世界上著名的CA機(jī)構(gòu)的證書(shū))查找對(duì)應(yīng)CA證書(shū),然后使用內(nèi)置的證書(shū)公鑰校驗(yàn)服務(wù)器的證書(shū)真?zhèn)巍H绻r?yàn)失敗,瀏覽器會(huì)提示服務(wù)器證書(shū)有問(wèn)題,詢(xún)問(wèn)用戶(hù)是否繼續(xù)。
例如12306網(wǎng)站,它使用的自簽名的證書(shū),所以瀏覽器會(huì)提示證書(shū)有問(wèn)題,在12306的網(wǎng)站上有提示下載安裝根證書(shū),其用戶(hù)就是把自己的根證書(shū)安裝到用戶(hù)機(jī)器的內(nèi)置證書(shū)中,這樣瀏覽器就不會(huì)報(bào)證書(shū)錯(cuò)誤。但是注意,除非特別相信某個(gè)機(jī)構(gòu),否則不要在機(jī)器上隨便導(dǎo)入證書(shū),很危險(xiǎn)。
2、req指令說(shuō)明
上一節(jié)我們看到了申請(qǐng)證書(shū)流程,生成密鑰對(duì)我們已經(jīng)知道,那么如何生成證書(shū)請(qǐng)求呢,req指令就該上場(chǎng)了,我們可以查看req的man手冊(cè),如下:
openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] [-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits][-newkey alg:file] [-nodes] [-key filename] [-keyform PEM|DER] [-keyout filename] [-keygen_engine id] [-[digest]] [-config filename] [-subj arg] [-multivalue-rdn] [-x509] [-days n] [-set_serial n][-asn1-kludge] [-no-asn1-kludge] [-newhdr] [-extensions section] [-reqexts section] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-batch] [-verbose] [-engine id]
發(fā)現(xiàn)其參數(shù)多而復(fù)雜,還有許多沒(méi)有用到過(guò)的參數(shù)。但是在實(shí)際應(yīng)用中我們使用到的參數(shù)很有限,我們根據(jù)req的基本功能來(lái)學(xué)習(xí)。
req的基本功能主要有兩個(gè):生成證書(shū)請(qǐng)求和生成自簽名證書(shū)。其他還有一些校驗(yàn)、查看請(qǐng)求文件等功能,示例會(huì)簡(jiǎn)單說(shuō)明下。參數(shù)說(shuō)明如下
[new/x509]
當(dāng)使用-new選取的時(shí)候,說(shuō)明是要生成證書(shū)請(qǐng)求,當(dāng)使用x509選項(xiàng)的時(shí)候,說(shuō)明是要生成自簽名證書(shū)。
[key/newkey/keyout]
key和newkey是互斥的,key是指定已有的密鑰文件,而newkey是指在生成證書(shū)請(qǐng)求或者自簽名證書(shū)的時(shí)候自動(dòng)生成密鑰,然后生成的密鑰名稱(chēng)有keyout參數(shù)指定。
當(dāng)指定newkey選項(xiàng)時(shí),后面指定rsa:bits說(shuō)明產(chǎn)生rsa密鑰,位數(shù)由bits指定。指定dsa:file說(shuō)明產(chǎn)生dsa密鑰,file是指生成dsa密鑰的參數(shù)文件(由dsaparam生成)
[in/out/inform/outform/keyform]
in選項(xiàng)指定證書(shū)請(qǐng)求文件,當(dāng)查看證書(shū)請(qǐng)求內(nèi)容或者生成自簽名證書(shū)的時(shí)候使用
out選項(xiàng)指定證書(shū)請(qǐng)求或者自簽名證書(shū)文件名,或者公鑰文件名(當(dāng)使用pubkey選項(xiàng)時(shí)用到),以及其他一些輸出信息。
inform、outform、keyform分別指定了in、out、key選項(xiàng)指定的文件格式,默認(rèn)是PEM格式。
[config]
參數(shù)文件,默認(rèn)是/etc/ssl/openssl.cnf(ubuntu12.04),根據(jù)系統(tǒng)不同位置不同。該文件包含生成req時(shí)的參數(shù),當(dāng)在命令行沒(méi)有指定時(shí),則采用該文件中的默認(rèn)值。
除上述主要參數(shù)外,還有許多其他的參數(shù),不在一一敘述,有興趣的讀者可以查看req的man手冊(cè)
3、req指令使用實(shí)例
(1)使用已有私鑰生成證書(shū)請(qǐng)求
使用原有的RSA密鑰生成證書(shū)請(qǐng)求文件,輸入主體相關(guān)信息:
$ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:AU
State or Province Name (full name) [Some-State]:BJ
Locality Name (eg, city) []:BJ
Organization Name (eg, company) [Internet Widgits Pty Ltd]:BJ
Organizational Unit Name (eg, section) []:BJ
Common Name (e.g. server FQDN or YOUR name) []:BJ
Email Address []:BJ
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:12345
An optional company name []:BJ
......
使用原有的RSA密鑰生成證書(shū)請(qǐng)求文件,指定-batch選項(xiàng),主體信息從配置文件讀?。?br />
$ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -batch
使用原有的RSA密鑰生成證書(shū)請(qǐng)求文件,指定-batch選項(xiàng),主體信息由命令行subj指定:
openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet
使用原有的RSA密鑰生成證書(shū)請(qǐng)求文件,指定-batch選項(xiàng),主體信息由命令行subj指定,且輸出公鑰:
$ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet -pubkey
可以看到公鑰和請(qǐng)求信息:
$ cat client.pem
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL6e+hk0TAsYlPk5XB1tLCtCO8wQ7JMM
YQ9SMy4Q1liPg4TdgSkdfbLB2UXmzzMCp+ZBDk9txwtewqv7PVcvY0MCAwEAAQ==
-----END PUBLIC KEY-----
-----BEGIN CERTIFICATE REQUEST-----
MIIBGDCBwwIBADA1MQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTER
MA8GA1UECgwISW50ZXJuZXQwXDANBgkqhkiG9w0BAQEFAANLADBIAkEAvp76GTRM
CxiU+TlcHW0sK0I7zBDskwxhD1IzLhDWWI+DhN2BKR19ssHZRebPMwKn5kEOT23H
C17Cq/s9Vy9jQwIDAQABoCkwJwYJKoZIhvcNAQkOMRowGDAJBgNVHRMEAjAAMAsG
A1UdDwQEAwIF4DANBgkqhkiG9w0BAQUFAANBAFBiB0fTUwTSoFeQdTWIr3KXzDHP
bgLy1/nlJ71dYLfGGrR61RKmrXgpf76akURtF+gEXwLMfPO6FQlaIOYEe/c=
-----END CERTIFICATE REQUEST-----
(2)自動(dòng)生成密鑰,生成證書(shū)請(qǐng)求文件
自動(dòng)生成1024位RSA密鑰,并生成證書(shū)請(qǐng)求文件:
$ openssl req -new -newkey rsa:1024 -out client.pem -keyout RSA.pem -batch
Generating a 1024 bit RSA private key
.......................................++++++
...............................++++++
writing new private key to 'RSA.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
......
自動(dòng)生成1024位RSA密鑰,并生成證書(shū)請(qǐng)求文件,指定-nodes文件,密鑰文件不加密:
$ openssl req -new -newkey rsa:1024 -out client.pem -keyout RSA.pem -batch -nodes
Generating a 1024 bit RSA private key
..++++++
.........................++++++
writing new private key to 'RSA.pem'
......
自動(dòng)生成1024位DSA密鑰參數(shù):
$ openssl dsaparam -out DSA.param 1024
Generating DSA parameters, 1024 bit long prime
This could take some time
...+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
................+...........+......+.+.............+.+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
自動(dòng)生成1024位DSA密鑰,并生成證書(shū)請(qǐng)求文件,指定-nodes文件,密鑰文件不加密:
$ openssl req -new -newkey dsa:DSA.param -out client.pem -keyout DSA.pem -batch -nodes
Generating a 1024 bit DSA private key
writing new private key to 'DSA.pem'
......
(3)生成自簽名證書(shū)
生成自簽名證書(shū),與req參數(shù)一樣,只需要把req修改為x509即可:
$ openssl req -x509 -newkey rsa:1024 -out client.cer -keyout RSA.pem -batch -nodes
Generating a 1024 bit RSA private key
.........++++++
..++++++
writing new private key to 'RSA.pem'
......
查看證書(shū)文件:
$ openssl x509 -in client.cer -noout -text
Certificate:
Data:
Version: 3 (0x2)
.....
Signature Algorithm: sha1WithRSAEncryption
5b:d7:f5:fd:18:3a:a9:22:2a:d9:f1:fc:00:3a:cf:23:ff:d1:
82:e5:2d:3f:7e:97:a8:38:32:e6:88:7a:ce:9f:31:cc:ea:60:
06:d1:96:bb:c8:42:ec:ef:26:73:4e:3b:2d:fa:0f:16:c2:25:
30:1b:a5:ca:35:bd:9b:dd:4b:41:d4:8b:95:3a:d4:7c:aa:8d:
0d:2d:e7:f3:95:33:d2:4a:5a:7f:a2:5d:cc:48:60:9f:ca:2d:
77:d9:ed:e9:09:f3:a1:18:96:1d:91:c6:1c:2b:7a:c1:d6:5d:
81:87:25:0d:32:6a:55:d2:89:95:c5:32:44:cc:9d:e7:68:6f:
d8:80
(4)查看證書(shū)請(qǐng)求內(nèi)容
生成證書(shū)請(qǐng)求:
$ openssl req -new -newkey rsa:1024 -out client.req -keyout RSA.pem -batch -nodes
Generating a 1024 bit RSA private key
...............................................................++++++
......................++++++
writing new private key to 'RSA.pem'
......
查看證書(shū)請(qǐng)求內(nèi)容,subject指定輸出主體:
$ openssl req -in client.req -noout -text -subject
Certificate Request:
Data:
Version: 0 (0x0)
Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
...
Exponent: 65537 (0x10001)
Attributes:
Requested Extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Key Usage:
Digital Signature, Non Repudiation, Key Encipherment
Signature Algorithm: sha1WithRSAEncryption
...
subject=/C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
(5)校驗(yàn)證書(shū)請(qǐng)求文件
指定verify指令,校驗(yàn)證書(shū)請(qǐng)求文件,其操作時(shí)提取請(qǐng)求文件中的公鑰來(lái)驗(yàn)證簽名信息:
$ openssl req -verify -in client.req -noout
verify OK
4、生成證書(shū)步驟小結(jié)
Step 1. Create key (password protected)
openssl genrsa -out prvtkey.pem 1024/2038 (with out password protected)
openssl genrsa -des3 -out prvtkey.pem 1024/2048 (password protected)
這個(gè)命令會(huì)生成一個(gè)1024/2048位的密鑰。
Step 2. Create certification request
openssl req -new -key prvtkey.pem -out cert.csr
openssl req -new -nodes -key prvtkey.pem -out cert.csr
這個(gè)命令將會(huì)生成一個(gè)證書(shū)請(qǐng)求,當(dāng)然,用到了前面生成的密鑰prvtkey.pem文件
這里將生成一個(gè)新的文件cert.csr,即一個(gè)證書(shū)請(qǐng)求文件,你可以拿著這個(gè)文件去數(shù)字證書(shū)頒發(fā)機(jī)構(gòu)(即CA)申請(qǐng)一個(gè)數(shù)字證書(shū)。CA會(huì)給你一個(gè)新的文件cacert.pem,那才是你的數(shù)字證書(shū)。
Step 3: Send certificate request to Certification Authority (CA)
如果是自己做測(cè)試,那么證書(shū)的申請(qǐng)機(jī)構(gòu)和頒發(fā)機(jī)構(gòu)都是自己。就可以用下面這個(gè)命令來(lái)生成證書(shū):
openssl req -new -x509 -key prvtkey.pem -out cacert.pem -days 1095
這個(gè)命令將用上面生成的密鑰privkey.pem生成一個(gè)數(shù)字證書(shū)cacert.pem