OpenSSL 證書請求和自簽名命令 req 詳解
1、金鑰、證書請求、證書概要說明
在證書申請簽發過程中,客戶端涉及到金鑰、證書請求、證書這幾個概念,初學者可能會搞不清楚三者的關係,網上有的根據字尾名來區分三者,更讓人一頭霧水。我們以申請證書的流程說明三者的關係。客戶端(相對於CA)在申請證書的時候,大體上有三個步驟:
- 第一步:生成客戶端的金鑰,即客戶端的公私鑰對,且要保證私鑰只有客戶端自己擁有。
- 第二步:以客戶端的金鑰和客戶端自身的資訊(國家、機構、域名、郵箱等)為輸入,生成證書請求檔案。其中客戶端的公鑰和客戶端資訊是明文儲存在證書請求檔案中的,而客戶端私鑰的作用是對客戶端公鑰及客戶端資訊做簽名,自身是不包含在證書請求中的。然後把證書請求檔案傳送給CA機構。
- 第三步:CA機構接收到客戶端的證書請求檔案後,首先校驗其簽名,然後稽核客戶端的資訊,最後CA機構使用自己的私鑰為證書請求檔案簽名,生成證書檔案,下發給客戶端。此證書就是客戶端的身份證,來表明使用者的身份。
至此客戶端申請證書流程結束,其中涉及到證書籤發機構CA,CA是被絕對信任的機構。如果把客戶端證書比作使用者身份證,那麼CA就是頒發身份證的機構,我們以https為例說明證書的用處。
為了資料傳輸安全,越來越多的網站啟用https。在https握手階段,伺服器首先把自己的證書傳送給使用者(瀏覽器),瀏覽器檢視證書中的發證機構,然後在機器內建的證書中(在PC或者手機上,內建了世界上著名的CA機構的證書)查詢對應CA證書,然後使用內建的證書公鑰校驗伺服器的證書真偽。如果校驗失敗,瀏覽器會提示伺服器證書有問題,詢問使用者是否繼續。
例如12306網站,它使用的自簽名的證書,所以瀏覽器會提示證書有問題,在12306的網站上有提示下載安裝根證書,其使用者就是把自己的根證書安裝到使用者機器的內建證書中,這樣瀏覽器就不會報證書錯誤。但是注意,除非特別相信某個機構,否則不要在機器上隨便匯入證書,很危險。
2、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選項的時候,說明是要生成自簽名證書。
[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手冊
3、req指令使用例項
1、使用已有私鑰生成證書請求
使用原有的RSA金鑰生成證書請求檔案,輸入主體相關資訊:
$ 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選項,主體資訊從配置檔案讀取:
$ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -batch
使用原有的RSA金鑰生成證書請求檔案,指定-batch選項,主體資訊由命令列subj指定:
openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet
使用原有的RSA金鑰生成證書請求檔案,指定-batch選項,主體資訊由命令列subj指定,且輸出公鑰:
$ openssl req -new -key RSA.pem -passin pass:123456 -out client.pem -subj /C=AU/ST=Some-State/O=Internet -pubkey
可以看到公鑰和請求資訊:
$ 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、自動生成金鑰,生成證書請求檔案
自動生成1024位RSA金鑰,並生成證書請求檔案:
$ 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檔案,金鑰檔案不加密:
$ 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金鑰引數:
$ openssl dsaparam -out DSA.param 1024 Generating DSA parameters, 1024 bit long prime This could take some time ...+.+..+.+++++++++++++++++++++++++++++++++++++++++++++++++++* ................+...........+......+.+.............+.+.....+.+++++++++++++++++++++++++++++++++++++++++++++++++++*
自動生成1024位DSA金鑰,並生成證書請求檔案,指定-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、生成自簽名證書
生成自簽名證書,與req引數一樣,只需要把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' ......
檢視證書檔案:
$ 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、檢視證書請求內容
生成證書請求:
$ 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指定輸出主體:
$ 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、校驗證書請求檔案
指定verify指令,校驗證書請求檔案,其操作時提取請求檔案中的公鑰來驗證簽名資訊:
$ openssl req -verify -in client.req -noout verify OK
4、小結
req命令引數紛繁多雜,上文中沒有完全介紹,而且還涉及到openssl.cnf配置檔案的內容,是一個負責而強大的指令。
為了方便記憶,不妨就記住它了兩個主要功能:生成證書請求檔案和生成自簽名證書,對比上述的主要引數定義,足可以應付大多數場景。
相關文章
- openssl生成自簽名證書
- 使用OpenSSL生成自簽名SSL證書
- 使用OpenSSL生成自簽名證書(IIS)搭建Https站點HTTP
- openssl 簽發證書
- windows下使用makecert命令生成自簽名證書Windows
- 什麼是自簽名證書?自簽名SSL證書的優缺點?
- 生成自簽名SSL證書
- 什麼是自簽名SSL證書?自簽名證書有哪些安全隱患?
- 建立自簽名根證書-中間證書。
- OpenSSL 生成 RootCA (根證書)並自簽署證書(支援 IP 地址)
- 自簽名SSL證書安全嗎?
- 自簽名證書 nginx tomcatNginxTomcat
- 使用mkcert建立自簽名證書mkcert
- 自簽名SSL證書有風險嗎?
- Xamarin Android使用自簽名證書Android
- 從自簽名證書匯出pfx和cer證書
- Apache 配置https 自簽名證書 或者 購賣證書ApacheHTTP
- 如何快速建立自簽名 SSL 證書 -- [mkcert]mkcert
- Moya,KingFisher中使用自簽名證書發起HTTPS請求HTTP
- PHP中使用OpenSSL下openssl_verify驗證簽名案例PHP
- 程式碼簽名證書
- Net8 使用BouncyCastle 生成自簽名證書AST
- ios簽名證書:什麼是證書?iOS
- 在Linux下如何根據域名自簽發OpenSSL證書與常用證書轉換Linux
- thawte程式碼簽名證書和Comodo程式碼簽名證書區別
- 簡易實現 HTTPS (二) 自簽名證書HTTP
- 怎麼使用iOS證書來申請簽名檔案iOS
- 申請程式碼簽名證書如何生成CSR檔案
- iOS證書籤名機制&重簽名&防止重簽名iOS
- EV程式碼簽名證書和標準程式碼簽名證書有何不同?
- 自簽名的SSL證書與專業的SSL證書有哪些區別?
- 蘋果簽名證書:共享證書和獨享證書找不同蘋果
- netcore 內網部署https自簽名證書NetCore內網HTTP
- 程式碼簽名證書與SSL證書區別
- 程式碼簽名證書申請時需要注意什麼
- 申請Sectigo OV程式碼簽名證書好不好Go
- RSA的主場-證書籤名&OpenSSL演示
- 詳解Sectigo EV程式碼簽名證書的特點及優勢Go