OpenSSL之req介紹

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)求

[
復(fù)制代碼

](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:~/testopenssl req -new -key RSA.pem -passin pass:123456 -out client.pem -batch /*使用原有的RSA密鑰生成證書請(qǐng)求文件,指定-batch選項(xiàng)昏滴,主體信息由命令行subj指定*/ 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:~/testopenssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet -pubkey /*可以看到公鑰和請(qǐng)求信息*/ 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>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

2拂共、自動(dòng)生成密鑰,生成證書請(qǐng)求文件

[
復(fù)制代碼

](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:~/testopenssl 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密鑰宜狐,并生成證書請(qǐng)求文件荆残,指定-nodes文件踪央,密鑰文件不加密*/ 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:~/testopenssl dsaparam -out DSA.param 1024 Generating DSA parameters, 1024 bit long prime This could take some time ...+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++* ................+...........+......+.+.............+.+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++* /*自動(dòng)1024位DSA密鑰,并生成證書請(qǐng)求文件巡蘸,指定-nodes文件络拌,密鑰文件不加密*/ 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>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

3俭驮、生成自簽名證書

[
復(fù)制代碼

](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:~/testopenssl 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 xlzh@cmos:~/test</pre>

[
復(fù)制代碼

](javascript:void(0); "復(fù)制代碼")

4混萝、查看證書請(qǐng)求內(nèi)容

[
復(fù)制代碼

](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>

[
復(fù)制代碼

](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:~/testopenssl req -verify -in client.req -noout verify OK 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)景脑蠕。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市跪削,隨后出現(xiàn)的幾起案子谴仙,更是在濱河造成了極大的恐慌,老刑警劉巖碾盐,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件晃跺,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡毫玖,警方通過查閱死者的電腦和手機(jī)掀虎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)付枫,“玉大人烹玉,你說(shuō)我怎么就攤上這事〔玻” “怎么了二打?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)叶眉。 經(jīng)常有香客問我址儒,道長(zhǎng),這世上最難降的妖魔是什么衅疙? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任莲趣,我火速辦了婚禮,結(jié)果婚禮上饱溢,老公的妹妹穿的比我還像新娘喧伞。我一直安慰自己,他們只是感情好绩郎,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布潘鲫。 她就那樣靜靜地躺著,像睡著了一般肋杖。 火紅的嫁衣襯著肌膚如雪溉仑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天状植,我揣著相機(jī)與錄音浊竟,去河邊找鬼怨喘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛振定,可吹牛的內(nèi)容都是我干的必怜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼后频,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼梳庆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起卑惜,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤膏执,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后露久,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胧后,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年抱环,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纸巷。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡镇草,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瘤旨,到底是詐尸還是另有隱情梯啤,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布存哲,位于F島的核電站因宇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏祟偷。R本人自食惡果不足惜察滑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望修肠。 院中可真熱鬧贺辰,春花似錦、人聲如沸嵌施。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吗伤。三九已至吃靠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間足淆,已是汗流浹背巢块。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工礁阁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人夕冲。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓氮兵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親歹鱼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泣栈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容