使用OpenSSL工具制作X.509證書的方法及其注意事項總結


如何使用OpenSSL工具生成根證書與應用證書


// 生成頂級CA的公鑰證書和私鑰文件,有效期10年(RSA 1024bits,默認) openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt // 為頂級CA的私鑰文件去除保護口令 openssl rsa -in CARoot1024.key -out CARoot1024.key // 生成頂級CA的公鑰證書和私鑰文件,有效期15年(RSA 2048bits,指定) openssl req -newkey rsa:2048 -x509 -days 5480 -keyout CARoot2048.key -out CARoot2048.crt // 為頂級CA的私鑰文件去除保護口令 openssl rsa -in CARoot2048.key -out CARoot2048.key // 為應用證書/中級證書生成私鑰文件 openssl genrsa -out app.key 2048 // 根據私鑰文件,為應用證書/中級證書生成 csr 文件(證書請求文件) openssl req -new -key app.key -out app.csr // 使用CA的公私鑰文件給 csr 文件簽名,生成應用證書,有效期5年 openssl ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything // 使用CA的公私鑰文件給 csr 文件簽名,生成中級證書,有效期5年 openssl ca -extensions v3_ca -in app.csr -out app.crt -cert CARoot1024.crt -keyfile CARoot1024.key -days 1826 -policy policy_anything

以上是生成根證書與應用證書過程中要用到的所有命令,根據生成目標不同,分為三組。其中,前面兩組都用於生成自簽名的頂級CA(區別只在於密鑰長度不同),實際應用中只需根據需求選擇一組即可。

最后一組用於生成非自簽名的證書,包括中級證書與應用證書。所謂中級證書,是具有繼續頒發下級證書權限的子CA,而本文中所說的應用證書,特指不能用來繼續頒發下級證書,只能用來證明個體身份的證書。頂級CA在簽發二者的時候,只是多少一個 -extensions v3_ca 選項的區別,這個選項賦予被簽發的證書繼續簽發下級證書的權力。

二、各步詳解

2.1 生成自簽名根證書(即頂級CA)

典型示例:openssl req -new-x509 -days5480 -keyoutCA.key -outCA.crt

[1] 命令選項和參數解讀

示例中,各選項(及參數)的意義如下:

req             使用openssl的req子命令
-new            生成新的證書請求
-x509           生成自簽名證書
-days 5480      自簽名證書的有效期5480天(15年)【僅當使用了 -x509 選項后有效】
-keyout CA.key  私鑰文件名指定為CA.key【若為運行前就已有的私鑰文件且原名不是CA.key,則改名為CA.key;否則新生成的私鑰文件命名為CA.key】
-out CA.crt     指定輸出所生成自簽名證書的信息到文件,且文件名為CA.crt【建議不要省略】

其中,-days,-keyout 兩個選項可以省略,省略的話使用默認值,有效期默認為 30 天【由程序內部在變量初始化的時候指定,與配置文件無關】,私鑰文件名的默認值由配置文件 openssl.cnf 中相關條目指定,沒改過的話為 privkey.pem。

選項 -out 若是省略的話,openssl不會以文件形式輸出生成的 證書/證書請求,而是會默認將文件的信息直接打印到屏幕上,這在大多數情況下,是不符合我們要求的。所以建議這個選項最好不要省略!

req子命令可以通過 -key 選項為證書請求指定使用一個已存在的私鑰文件。但在示例中的情況下,雖然使用了-new 和 -x509兩個選項,但沒有使用 -key 選項,這時,req子命令會自動為自簽名證書生成一個RSA私鑰,密鑰長度的默認值由配置文件 openssl.cnf 中的相關條目指定,沒改過的話為 1024 bits。

[2] 關於私鑰文件加密口令的指定

運行中會提示輸入加密口令,如下:

writing new private key to 'CA.key'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:

此口令用於加密私鑰文件 CA.key 中的私鑰信息,如果不想在運行過程中還要輸入加密口令,則可以使用選項 -passout 在命令中直接指定。選項 -passout 的使用形式為:

-passoutarg

其中,arg是選項 -passout 的參數,其格式有多種,詳參《OpenSSL官方文檔》中關於"PASS_PHRASE_ARGUMENTS"的介紹。

本小節典型示例中的命令,可以用選項 -passout 改造如下:

openssl req -new-x509 -days5480 -keyoutCA.key -out CA.crt-passoutpass:1314

由於Linux系統中可以使用history命令查看歷史指令記錄,所以出於安全方面的考量,一般如非必要,不建議在命令中直接指定口令。這與mysql登錄的時候不在 -p 選項里直接指定登錄口令的原因是一致的。

[3] 關於證書請求文件中的DN字段

運行中會提示輸入一些 Distinguished Name fields,即證書的識別名信息字段,簡稱為DN字段,如下:

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) [GB]:US
State or Province Name (full name) [Berkshire]:California
Locality Name (eg, city) [Newbury]:
Organization Name (eg, company) [My Company Ltd]:GeoAuth Inc.
Organizational Unit Name (eg, section) []:.
Common Name (eg, your name or your server's hostname) []:Authentication Global Root
Email Address []:.

這些DN字段大部分有默認值,默認值由配置文件 openssl.cnf中相關條目指定。如要在某一個DN字段使用默認值,則無需輸入任何信息,直接點擊"Enter"鍵;如果確實某個DN字段的值要置為空,則輸入一個 '.' 后,點擊"Enter"鍵。

這些DN字段主要是拿來識別證書持有者身份的,下表是關於它們的縮寫、說明和一些填寫說明。【此部分參考了互動百科的SSL條目】


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com