1米绕、密鑰、證書請(qǐng)求馋艺、證書概要說(shuō)明
在證書申請(qǐng)簽發(fā)過程中栅干,客戶端涉及到密鑰、證書請(qǐng)求捐祠、證書這幾個(gè)概念碱鳞,初學(xué)者可能會(huì)搞不清楚三者的關(guān)系,網(wǎng)上有的根據(jù)后綴名來(lái)區(qū)分三者踱蛀,更讓人一頭霧水窿给。我們以申請(qǐng)證書的流程說(shuō)明三者的關(guān)系÷示埽客戶端(相對(duì)于CA)在申請(qǐng)證書的時(shí)候崩泡,大體上有三個(gè)步驟:
<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">第一步:生成客戶端的密鑰,即客戶端的公私鑰對(duì)猬膨,且要保證私鑰只有客戶端自己擁有允华。
第二步:以客戶端的密鑰和客戶端自身的信息(國(guó)家、機(jī)構(gòu)、域名靴寂、郵箱等)為輸入,生成證書請(qǐng)求文件召耘。其中客戶端的公鑰和客戶端信息是明文保存在證書請(qǐng)求文件中的百炬,而客戶端私鑰的作用是對(duì)客戶端公鑰及客戶端信息做簽名,自身是不包含在證書請(qǐng)求中的污它。然后把證書請(qǐng)求文件發(fā)送給CA機(jī)構(gòu)剖踊。
第三步:CA機(jī)構(gòu)接收到客戶端的證書請(qǐng)求文件后,首先校驗(yàn)其簽名衫贬,然后審核客戶端的信息德澈,最后CA機(jī)構(gòu)使用自己的私鑰為證書請(qǐng)求文件簽名,生成證書文件固惯,下發(fā)給客戶端梆造。此證書就是客戶端的身份證,來(lái)表明用戶的身份葬毫。</pre>
至此客戶端申請(qǐng)證書流程結(jié)束镇辉,其中涉及到證書簽發(fā)機(jī)構(gòu)CA,CA是被絕對(duì)信任的機(jī)構(gòu)贴捡。如果把客戶端證書比作用戶身份證忽肛,那么CA就是頒發(fā)身份證的機(jī)構(gòu),我們以https為例說(shuō)明證書的用處烂斋。
為了數(shù)據(jù)傳輸安全屹逛,越來(lái)越多的網(wǎng)站啟用https。在https握手階段汛骂,服務(wù)器首先把自己的證書發(fā)送給用戶(瀏覽器)罕模,瀏覽器查看證書中的發(fā)證機(jī)構(gòu),然后在機(jī)器內(nèi)置的證書中(在PC或者手機(jī)上香缺,內(nèi)置了世界上著名的CA機(jī)構(gòu)的證書)查找對(duì)應(yīng)CA證書手销,然后使用內(nèi)置的證書公鑰校驗(yàn)服務(wù)器的證書真?zhèn)巍H绻r?yàn)失敗图张,瀏覽器會(huì)提示服務(wù)器證書有問題锋拖,詢問用戶是否繼續(xù)。
例如12306網(wǎng)站祸轮,它使用的自簽名的證書兽埃,所以瀏覽器會(huì)提示證書有問題,在12306的網(wǎng)站上有提示下載安裝根證書适袜,其用戶就是把自己的根證書安裝到用戶機(jī)器的內(nèi)置證書中柄错,這樣瀏覽器就不會(huì)報(bào)證書錯(cuò)誤。但是注意,除非特別相信某個(gè)機(jī)構(gòu)售貌,否則不要在機(jī)器上隨便導(dǎo)入證書给猾,很危險(xiǎn)。
2颂跨、req指令說(shuō)明
上一節(jié)我們看到了申請(qǐng)證書流程敢伸,生成密鑰對(duì)我們已經(jīng)知道,那么如何生成證書請(qǐng)求呢恒削,req指令就該上場(chǎng)了池颈,我們可以查看req的man手冊(cè),如下
<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">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]</pre>
發(fā)現(xiàn)其參數(shù)多而復(fù)雜钓丰,還有許多沒有用到過的參數(shù)躯砰。但是在實(shí)際應(yīng)用中我們使用到的參數(shù)很有限,我們根據(jù)req的基本功能來(lái)學(xué)習(xí)携丁。
req的基本功能主要有兩個(gè):生成證書請(qǐng)求和生成自簽名證書琢歇。其他還有一些校驗(yàn)、查看請(qǐng)求文件等功能则北,示例會(huì)簡(jiǎn)單說(shuō)明下矿微。參數(shù)說(shuō)明如下
[new/x509]
當(dāng)使用-new選取的時(shí)候,說(shuō)明是要生成證書請(qǐng)求尚揣,當(dāng)使用x509選項(xiàng)的時(shí)候涌矢,說(shuō)明是要生成自簽名證書。
[/key/newkey/keyout]
key和newkey是互斥的快骗,key是指定已有的密鑰文件娜庇,而newkey是指在生成證書請(qǐng)求或者自簽名證書的時(shí)候自動(dò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)指定證書請(qǐng)求文件,當(dāng)查看證書請(qǐng)求內(nèi)容或者生成自簽名證書的時(shí)候使用
out選項(xiàng)指定證書請(qǐng)求或者自簽名證書文件名巾表,或者公鑰文件名(當(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)在命令行沒有指定時(shí)鹦倚,則采用該文件中的默認(rèn)值董虱。
除上述主要參數(shù)外,還有許多其他的參數(shù)申鱼,不在一一敘述,有興趣的讀者可以查看req的man手冊(cè)
3云头、req指令使用實(shí)例
1捐友、使用已有私鑰生成證書請(qǐng)求
[](javascript:void(0); "復(fù)制代碼")
<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">/使用原有的RSA密鑰生成證書請(qǐng)求文件,輸入主體相關(guān)信息/ xlzh@cmos:~/test$ 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密鑰生成證書請(qǐng)求文件溃槐,指定-batch選項(xiàng)匣砖,主體信息從配置文件讀取/ xlzh@cmos:~/test openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet /使用原有的RSA密鑰生成證書請(qǐng)求文件猴鲫,指定-batch選項(xiàng),主體信息由命令行subj指定谣殊,且輸出公鑰/ xlzh@cmos:~/test
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----- xlzh@cmos:~/test$</pre>
](javascript:void(0); "復(fù)制代碼")
2拂共、自動(dòng)生成密鑰,生成證書請(qǐng)求文件
[](javascript:void(0); "復(fù)制代碼")
<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">/自動(dòng)1024位RSA密鑰姻几,并生成證書請(qǐng)求文件/ xlzh@cmos:~/test 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'
/生成1024位DSA密鑰參數(shù)/ xlzh@cmos:~/test 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'
-----</pre>
](javascript:void(0); "復(fù)制代碼")
3俭驮、生成自簽名證書
[](javascript:void(0); "復(fù)制代碼")
<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">/生成自簽名證書,與req參數(shù)一樣春贸,只需要把req修改為x509即可/ xlzh@cmos:~/test$ 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'
/查看證書文件/ xlzh@cmos:~/test</pre>
](javascript:void(0); "復(fù)制代碼")
4混萝、查看證書請(qǐng)求內(nèi)容
[](javascript:void(0); "復(fù)制代碼")
<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">/生成證書請(qǐng)求/ xlzh@cmos:~/test$ 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'
/查看證書請(qǐng)求內(nèi)容,subject指定輸出主體/ xlzh@cmos:~/test$ 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</pre>
](javascript:void(0); "復(fù)制代碼")
5祥诽、校驗(yàn)證書請(qǐng)求文件
<pre style="margin: 0px; padding: 0px; transition-duration: 0.2s; transition-property: background-color, border-color, border-radius, padding, margin, color, opacity; overflow: auto; font-family: "Courier New"; font-size: 12px; overflow-wrap: break-word;">/指定verify指令譬圣,校驗(yàn)證書請(qǐng)求文件,其操作時(shí)提取請(qǐng)求文件中的公鑰來(lái)驗(yàn)證簽名信息/ xlzh@cmos:~/test</pre>
4雄坪、小結(jié)
req命令參數(shù)紛繁多雜厘熟,上文中沒有完全介紹屯蹦,而且還涉及到openssl.cnf配置文件的內(nèi)容,是一個(gè)復(fù)雜而強(qiáng)大的指令绳姨。
為了方便記憶登澜,不妨就記住它了兩個(gè)主要功能:生成證書請(qǐng)求文件和生成自簽名證書,對(duì)比上述的主要參數(shù)定義飘庄,足可以應(yīng)付大多數(shù)場(chǎng)景脑蠕。