系統:CentOS7 32位
目標:使用OpenSSL生成一個CA根證書,並用這個根證書頒發兩個子證書server和client。
先確保系統中安裝了OpenSSL,若沒安裝,可以通過以下命令安裝:
1 | sudo yum install openssl |
修改OpenSSL的配置
安裝好之後,定位一下OpenSSL的配置文件openssl.cnf:
1 | locate openssl.cnf |
如圖,我這裏的目錄是/etc/pki/tls/openssl.cnf。
修改配置文件,修改其中的dir變量,重新設置SSL的工作目錄:
由於配置文件中,dir變量下還有幾個子文件夾需要用到,因此在自定義的文件夾下面也創建這幾個文件夾或文件,它們是:
certs——存放已頒發的證書
newcerts——存放CA指令生成的新證書
private——存放私鑰
crl——存放已吊銷的整數
index.txt——OpenSSL定義的已簽發證書的文本數據庫文件,這個文件通常在初始化的時候是空的
serial——證書籤發時使用的序列號參考文件,該文件的序列號是以16進制格式進行存放的,該文件必須提供並且包含一個有效的序列號
生成證書之前,需要先生成一個隨機數:
1 | openssl rand -out private/.rand 1000 |
該命令含義如下:
rand——生成隨機數
-out——指定輸出文件
1000——指定隨機數長度
生成根證書
a).生成根證書私鑰(pem文件)
OpenSSL通常使用PEM(Privacy Enbanced Mail)格式來保存私鑰,構建私鑰的命令如下:
1 | openssl genrsa -aes256 -out private /cakey .pem 1024 |
該命含義如下:
genrsa——使用RSA算法產生私鑰
-aes256——使用256位密鑰的AES算法對私鑰進行加密
-out——輸出文件的路徑
1024——指定私鑰長度
b).生成根證書籤發申請文件(csr文件)
使用上一步生成的私鑰(pem文件),生成證書請求文件(csr文件):
1 2 | openssl req -new -key private /cakey .pem -out private /ca .csr -subj \ "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname" |
該命令含義如下:
req——執行證書籤發命令
-new——新證書籤發請求
-key——指定私鑰路徑
-out——輸出的csr文件的路徑
-subj——證書相關的用戶信息(subject的縮寫)
c).自簽發根證書(cer文件)
csr文件生成以後,可以將其發送給CA認證機構進行簽發,當然,這裏我們使用OpenSSL對該證書進行自簽發:
1 2 | openssl x509 -req -days 365 -sha1 -extensions v3_ca -signkey \ private /cakey .pem - in private /ca .csr -out certs /ca .cer |
該命令的含義如下:
x509——生成x509格式證書
-req——輸入csr文件
-days——證書的有效期(天)
-sha1——證書摘要採用sha1算法
-extensions——按照openssl.cnf文件中配置的v3_ca項添加擴展
-signkey——簽發證書的私鑰
-in——要輸入的csr文件
-out——輸出的cer證書文件
之後看一下certs文件夾裏生成的ca.cer證書文件:
用根證書籤發server端證書
和生成根證書的步驟類似,這裏就不再介紹相同的參數了。
a).生成服務端私鑰
1 | openssl genrsa -aes256 -out private /server-key .pem 1024 |
b).生成證書請求文件
1 2 | openssl req -new -key private /server-key .pem -out private /server .csr -subj \ "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname" |
c).使用根證書籤發服務端證書
1 2 | openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs /ca .cer -CAkey private /cakey .pem \ -CAserial ca.srl -CAcreateserial - in private /server .csr -out certs /server .cer |
這裏有必要解釋一下這幾個參數:
-CA——指定CA證書的路徑
-CAkey——指定CA證書的私鑰路徑
-CAserial——指定證書序列號文件的路徑
-CAcreateserial——表示創建證書序列號文件(即上方提到的serial文件),創建的序列號文件默認名稱爲-CA,指定的證書名稱後加上.srl後綴
注意:這裏指定的-extensions的值爲v3_req,在OpenSSL的配置中,v3_req配置的basicConstraints的值爲CA:FALSE,如圖:
而前面生成根證書時,使用的-extensions值爲v3_ca,v3_ca中指定的basicConstraints的值爲CA:TRUE,表示該證書是頒發給CA機構的證書,如圖:
在x509指令中,有多重方式可以指定一個將要生成證書的序列號,可以使用set_serial選項來直接指定證書的序列號,也可以使用-CAserial選項來指定一個包含序列號的文件。所謂的序列號是一個包含一個十六進制正整數的文件,在默認情況下,該文件的名稱爲輸入的證書名稱加上.srl後綴,比如輸入的證書文件爲ca.cer,那麼指令會試圖從ca.srl文件中獲取序列號,可以自己創建一個ca.srl文件,也可以通過-CAcreateserial選項來生成一個序列號文件。
用根證書籤發client端證書
和簽發server端的證書的過程類似,只是稍微改下參數而已。
a).生成客戶端私鑰
1 | openssl genrsa -aes256 -out private /client-key .pem 1024 |
b).生成證書請求文件
1 2 | openssl req -new -key private /client-key .pem -out private /client .csr -subj \ "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname" |
c).使用根證書籤發客戶端證書
1 2 | openssl x509 -req -days 365 -sha1 -extensions v3_req -CA certs /ca .cer -CAkey private /cakey .pem \ -CAserial ca.srl - in private /client .csr -out certs /client .cer |
需要注意的是,上方簽發服務端證書時已經使用-CAcreateserial生成過ca.srl文件,因此這裏不需要帶上這個參數了。
至此,我們已經使用OpenSSL自簽發了一個CA證書ca.cer,並用這個CA證書籤發了server.cer和client.cer兩個子證書了:
導出證書
a).導出客戶端證書
1 2 | openssl pkcs12 - export -clcerts -name myclient -inkey \ private /client-key .pem - in certs /client .cer -out certs /client .keystore |
參數含義如下:
pkcs12——用來處理pkcs#12格式的證書
-export——執行的是導出操作
-clcerts——導出的是客戶端證書,-cacerts則表示導出的是ca證書
-name——導出的證書別名
-inkey——證書的私鑰路徑
-in——要導出的證書的路徑
-out——輸出的密鑰庫文件的路徑
b).導出服務端證書
1 2 | openssl pkcs12 - export -clcerts -name myserver -inkey \ private /server-key .pem - in certs /server .cer -out certs /server .keystore |
c).信任證書的導出
1 2 | keytool -importcert -trustcacerts - alias www.mydomain.com \ - file certs /ca .cer -keystore certs /ca-trust .keystore |