openssl 證書請求和自簽名命令req詳解

一、密鑰、證書請求、證書概要說明

在證書申請簽發過程當中,客戶端涉及到密鑰、證書請求、證書這幾個概念,初學者可能會搞不清楚三者的關係,網上有的根據後綴名來區分三者,更讓人一頭霧水。咱們以申請證書的流程說明三者的關係。客戶端(相對於CA)在申請證書的時候,大致上有三個步驟:node

第一步:生成客戶端的密鑰,即客戶端的公私鑰對,且要保證私鑰只有客戶端本身擁有。

第二步:以客戶端的密鑰和客戶端自身的信息(國家、機構、域名、郵箱等)爲輸入,生成證書請求文件。其中客戶端的公鑰和客戶端信息是明文保存在證書請求文件中的,而客戶端私鑰的做用是對客戶端公鑰及客戶端信息作簽名,自身是不包含在證書請求中的。而後把證書請求文件發送給CA機構。

第三步:CA機構接收到客戶端的證書請求文件後,首先校驗其簽名,而後審覈客戶端的信息,最後CA機構使用本身的私鑰爲證書請求文件簽名,生成證書文件,下發給客戶端。此證書就是客戶端的身份證,來代表用戶的身份。

至此客戶端申請證書流程結束,其中涉及到證書籤發機構CA,CA是被絕對信任的機構。若是把客戶端證書比做用戶身份證,那麼CA就是頒發身份證的機構,咱們以https爲例說明證書的用處。git

爲了數據傳輸安全,愈來愈多的網站啓用https。在https握手階段,服務器首先把本身的證書發送給用戶(瀏覽器),瀏覽器查看證書中的發證機構,而後在機器內置的證書中(在PC或者手機上,內置了世界上著名的CA機構的證書)查找對應CA證書,而後使用內置的證書公鑰校驗服務器的證書真僞。若是校驗失敗,瀏覽器會提示服務器證書有問題,詢問用戶是否繼續。ubuntu

例如12306網站,它使用的自簽名的證書,因此瀏覽器會提示證書有問題,在12306的網站上有提示下載安裝根證書,其用戶就是把本身的根證書安裝到用戶機器的內置證書中,這樣瀏覽器就不會報證書錯誤。可是注意,除非特別相信某個機構,不然不要在機器上隨便導入證書,很危險。瀏覽器

二、req指令說明

上一節咱們看到了申請證書流程,生成密鑰對咱們已經知道,那麼如何生成證書請求呢,req指令就該上場了,咱們能夠查看req的man手冊,以下安全

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]

發現其參數多而複雜,還有許多沒有用到過的參數。可是在實際應用中咱們使用到的參數頗有限,咱們根據req的基本功能來學習。服務器

req的基本功能主要有兩個:生成證書請求和生成自簽名證書。其餘還有一些校驗、查看請求文件等功能,示例會簡單說明下。參數說明以下學習

[new/x509]網站

當使用-new選取的時候,說明是要生成證書請求,當使用x509選項的時候,說明是要生成自簽名證書。ui

[/key/newkey/keyout]加密

key和newkey是互斥的,key是指定已有的密鑰文件,而newkey是指在生成證書請求或者自簽名證書的時候自動生成密鑰,而後生成的密鑰名稱有keyout參數指定。

當指定newkey選項時,後面指定rsa:bits說明產生rsa密鑰,位數由bits指定。指定dsa:file說明產生dsa密鑰,file是指生成dsa密鑰的參數文件(由dsaparam生成)

[in/out/inform/outform/keyform]

in選項指定證書請求文件,當查看證書請求內容或者生成自簽名證書的時候使用

out選項指定證書請求或者自簽名證書文件名,或者公鑰文件名(當使用pubkey選項時用到),以及其餘一些輸出信息。

inform、outform、keyform分別指定了in、out、key選項指定的文件格式,默認是PEM格式。

[config]

參數文件,默認是/etc/ssl/openssl.cnf(ubuntu12.04),根據系統不一樣位置不一樣。該文件包含生成req時的參數,當在命令行沒有指定時,則採用該文件中的默認值。

除上述主要參數外,還有許多其餘的參數,不在一一敘述,有興趣的讀者能夠查看req的man手冊

三、req指令使用實例

一、使用已有私鑰生成證書請求

/*使用原有的RSA密鑰生成證書請求文件,輸入主體相關信息*/
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密鑰生成證書請求文件,指定-batch選項,主體信息從配置文件讀取*/
xlzh@cmos:~/test$ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -batch
/*使用原有的RSA密鑰生成證書請求文件,指定-batch選項,主體信息由命令行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密鑰生成證書請求文件,指定-batch選項,主體信息由命令行subj指定,且輸出公鑰*/
xlzh@cmos:~/test$ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet -pubkey
/*能夠看到公鑰和請求信息*/
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$

二、自動生成密鑰,生成證書請求文件

/*自動1024位RSA密鑰,並生成證書請求文件*/
xlzh@cmos:~/test$ 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:
-----
/*自動1024位RSA密鑰,並生成證書請求文件,指定-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密鑰參數*/
xlzh@cmos:~/test$ openssl dsaparam -out DSA.param 1024
Generating DSA parameters, 1024 bit long prime
This could take some time
...+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
................+...........+......+.+.............+.+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
/*自動1024位DSA密鑰,並生成證書請求文件,指定-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'
-----

三、生成自簽名證書

/*生成自簽名證書,與req參數同樣,只須要把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$ 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
xlzh@cmos:~/test$

四、查看證書請求內容

/*生成證書請求*/
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'
-----
/*查看證書請求內容,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

五、校驗證書請求文件

/*指定verify指令,校驗證書請求文件,其操做時提取請求文件中的公鑰來驗證簽名信息*/
xlzh@cmos:~/test$ openssl req -verify -in client.req -noout
verify OK
xlzh@cmos:~/test$

四、小結

req命令參數紛繁多雜,上文中沒有徹底介紹,並且還涉及到openssl.cnf配置文件的內容,是一個複雜而強大的指令。

爲了方便記憶,不妨就記住它了兩個主要功能:生成證書請求文件和生成自簽名證書,對比上述的主要參數定義,足能夠應付大多數場景。

相關文章
相關標籤/搜索