利用openssl構建根證書-服務器證書-客戶證書

利用openssl構建根證書-服務器證書-客戶證書

OpenSSL功能遠勝於KeyTool,可用於根證書,服務器證書和客戶證書的管理html

一.構建根證書

1.構建根證書前,須要構建隨機數文件(.rand),完整命令如

openssl rand -out private/.rand 1000
rand       隨機數命令。這裏將隨機數文件輸出到private目錄下。
-out      輸出文件路徑,
這裏的參數1000,指定來產生僞隨機字節數

2.構建根證書私鑰

openssl genrsa -aes256 -out private/ca.key.pem 2048

3.生成根證書籤發申請

完成密鑰構建操做後,咱們須要生成根證書籤發申請文件(ca.csr),完整命令如代碼算法

openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=BJ/L=BJ/O=lesaas/OU=lesaas/CN=*.lesaas.cn"
req          產生證書籤發申請命令
-new         表示新請求
-key         密鑰,這裏爲private/ca.key.pem文件
-out         輸出路徑,這裏爲private/ca.csr文件
-subj        指定用戶信息。這裏使用泛域名"*.lesaas.cn"

獲得根證書籤發申請文件後,咱們能夠將其發生給CA機構簽發,固然咱們也能夠自行簽發根證書。安全

4.簽發根證書(自行簽發根證書)

openssl x509 -req -days 10000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
x509        簽發X.509格式證書命令。
-req        表示證書輸入請求。
-days       表示有效天數,這裏爲10000天。
-shal       表示證書摘要算法,這裏爲SHA1算法。
-extensions 表示按OpenSSL配置文件v3_ca項添加擴展。
-signkey    表示自簽名密鑰,這裏爲private/ca.key.pem。
-in         表示輸入文件,這裏爲private/ca.csr。
-out        表示輸出文件,這裏爲certs/ca.cer。

OpenSSL產生的數據證書不能再JAVA語言環境中直接使用,須要將其轉化爲PKCS#12編碼格式。
完整命令如代碼服務器

5.根證書轉化

openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certs/ca.cer -out certs/ca.p12
pkcs12          PKCS#12編碼格式證書命令。
-export         表示導出證書。
-cacerts        表示僅導出CA證書。
-inkey          表示輸入密鑰,這裏爲private/ca.key.pem
-in             表示輸入文件,這裏爲certs/ca.cer
-out            表示輸出文件,這裏爲certs/ca.p12

我的信息交換文件(PKCS#12) 能夠做爲密鑰庫或信任庫使用,咱們能夠經過KeyTool查看密鑰庫的詳細信息。網絡

6.查看密鑰庫信息

keytool -list -keystore d:/CA/certs/ca.p12 -storetype pkcs12 -v -storepass 123456

注意,這裏參數-storetype值爲「pkcs12」。
咱們已經構建了根證書(ca.cer),咱們可使用根證書籤發服務器證書和客戶證書。工具

二.構建服務器證書

服務器證書的構建與根證書構建類似,首先須要構建私鑰。編碼

1.構建服務器私鑰

openssl genrsa -aes256 -out private/server.key.pem 2048
genrsa       產生RSA密鑰命令。
-aes256      使用AES算法(256位密鑰)對產生的私鑰加密。可選算法包括DES,DESede,IDEA和AES。
-out         輸出路徑,這裏指private/server.key.pem。
這裏的參數2048,指RSA密鑰長度位數,默認長度爲512位。

2.生成服務器證書籤發申請

openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=BJ/L=BJ/O=lesaas/OU=lesaas/CN=www.lesaas.cn"
req          產生證書籤發申請命令
 -new         表示新請求。
 -key         密鑰,這裏爲private/ca.key.pem文件
 -out         輸出路徑,這裏爲private/ca.csr文件
 -subj        指定用戶信息,這裏使用域名「www.lesaas.cn」做爲用戶名。

咱們已經得到了根證書,可使用根證書籤發服務器證書。加密

3.簽發服務器證書

openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out 
certs/server.cer
x509           簽發X.509格式證書命令。
-req           表示證書輸入請求。
-days          表示有效天數,這裏爲3650天。
-sha1          表示證書摘要算法,這裏爲SHA1算法。
-extensions    表示按OpenSSL配置文件v3_req項添加擴展。
-CA            表示CA證書,這裏爲certs/ca.cer
-CAkey         表示CA證書密鑰,這裏爲private/ca.key.pem
-CAserial      表示CA證書序列號文件,這裏爲ca.srl
-CAcreateserial表示建立CA證書序列號
-in            表示輸入文件,這裏爲private/server.csr
-out           表示輸出文件,這裏爲certs/server.cer

這裏咱們一樣須要將OpenSSL產生的數子證書轉化爲PKCS#12編碼格式。完整命令以下.net

4.服務器證書轉換

openssl pkcs12 -export -clcerts -inkey private/server.key.pem -in certs/server.cer -out certs/server.p12
pkcs12         PKCS#12編碼格式證書命令。
 -export        表示導出證書。
 -clcerts       表示僅導出客戶證書。
 -inkey         表示輸入文件,這裏爲private/server.key.pem
 -in            表示輸入文件,這裏爲certs/ca.cer
 -out           表示輸出文件,這裏爲certs/server.p12

咱們已經構建了服務器證書(server.cer),並可以使用該證書構建基於單向認證網絡code

三.構建客戶證書

客戶證書的構建與服務器證書構建基本一致,首先須要構建私鑰。

1.產生客戶私鑰

openssl genrsa -aes256 -out private/client.key.pem 2048
genrsa         產生RSA密鑰命令
-aes256        使用AES算法(256爲密鑰)對產生的私鑰加密。可選算法包括DES,DESede,IDEA和AES。
 -out           輸出路徑,這裏指private/client.key.pem
這裏的參數2048,指RSA密鑰長度位數,默認長度爲512位

完成客戶證書密鑰構建後,咱們須要產生客戶證書籤發申請

2.生成客戶證書籤發申請

openssl req -new -key private/client.key.pem -out private/client.csr -subj "/C=CN/ST=BJ/L=BJ/O=lesaas/OU=lesaas/CN=lesaas"
req            產生證書籤發申請命令
-new           表示新的請求。
-key           密鑰,這裏爲private/client.csr文件
-subj          指定用戶信息,這裏使用「lesaas」做爲用戶名

咱們已經得到了根證書,可使用根證書籤發客戶證書(client.cer)

3.簽發客戶證書

openssl ca -days 3650 -in private/client.csr -out certs/client.cer -cert certs/ca.cer -keyfile private/ca.key.pem
ca            簽發證書命令
-days         表示證書有效期,這裏爲3650天。
-in           表示輸入文件,這裏爲private/client.csr
-out          表示輸出文件,這裏爲certs/server.cer
-cert         表示證書文件,這裏爲certs/ca.cer
-keyfile      表示根證書密鑰文件,這裏爲private/ca.key.pem

最後,咱們須要將得到客戶證書轉化Java語言能夠識別的PKCS#12編碼格式。

4.客戶證書轉換

openssl pkcs12 -export -inkey private/client.key.pem -in certs/client.cer -out certs/client.p12
pkcs12       PKCS#12編碼格式證書命令、
-export      表示導出證書
-clcerts     表示僅導出客戶證書。
-inkey       表示輸入密鑰,這裏爲private/client.key.pem
-in          表示輸入文件,這裏爲certs/client.cer
-out         表示輸出文件,這裏爲certs/client.p12

至此,咱們完成了雙向認證的所需的所有證書。

數字證書是公鑰的載體,而密鑰庫能夠包含公鑰、私鑰信息。 
JKS和PKCS#12都是比較經常使用的兩種密鑰庫格式/標準。對於前者,搞Java開發,尤爲是接觸過HTTPS平臺的朋友,並不陌生。JKS文件(一般爲*.jks或*.keystore,擴展名無關)能夠經過Java原生工具——KeyTool生成;然後者PKCS#12文件(一般爲*.p12或*.pfx,意味我的信息交換文件),則是經過更爲經常使用的OpenSSL工具產生。 
固然,這二者之間是能夠經過導入/導出的方式進行轉換的!固然,這種轉換須要經過KeyTool工具進行! 
迴歸正題,計費同事遇到一個難題:合做方交給他們一個*.pfx文件,須要他們從中提取密鑰,而後進行加密交互。其實,經過Java直接操做密鑰庫文件(或我的信息交換文件)對於通常Java開發人員來講,這都是個冷門。不接觸數字安全,根本不知所云。何況,Java原生的密鑰庫文件格式爲JKS,如何操做*.pfx文件?密鑰庫操做須要獲知密鑰庫別名,*.pfx別名是什麼?!接下來就解決這些問題!

(PKCS#12是base64編碼的)

方案:

經過keytool密鑰庫導入命令importkeystore,將密鑰庫格式由PKCS#12轉換爲JKS。
檢索新生成的密鑰庫文件,提取別名信息。
由密鑰庫文件導出數字證書(這裏將用到別名)。
經過代碼提取公鑰/私鑰、簽名算法等
先看格式轉換: 
Cmd代碼  收藏代碼
echo 格式轉換  
keytool -importkeystore -v  -srckeystore zlex.pfx -srcstoretype pkcs12 -srcstorepass 123456 -destkeystore zlex.keystore -deststoretype jks -deststorepass 123456  
-importkeystore導入密鑰庫,經過格式設定,咱們能夠將PKCS#12文件轉換爲JKS格式。 
-v顯示詳情 
-srckeystore源密鑰庫,這裏是zlex.pfx 
-srcstoretype源密鑰庫格式,這裏爲pkcs12 
-srcstorepass源密鑰庫密碼,這裏爲123456 
-destkeystore目標密鑰庫,這裏爲zlex.keystore 
-deststoretype目標密鑰庫格式,這裏爲jks,默認值也如此 
-deststorepass目標密鑰庫密碼,這裏爲123456 
經過這個操做,咱們可以得到所需的密鑰庫文件zlex.keystore。 
這時,咱們已經得到了密鑰庫文件,只要肯定對應的別名信息,就能夠提取公鑰/私鑰,以及數字證書,進行加密交互了! 
Cmd代碼  收藏代碼
echo 查看證書  
keytool -list -keystore zlex.keystore -storepass 123456 -v  
-list列舉密鑰庫
-keystore密鑰庫,這裏是zlex.keystore
-storepass密鑰庫密碼,這裏是123456
-v顯示詳情
如今,咱們把證書導出! 
Cmd代碼  收藏代碼
echo 導出證書  
keytool -exportcert -alias 1 -keystore zlex.keystore -file zlex.crt -storepass 123456  
-exportcert導出證書
-alias別名,這裏是1
-keystore密鑰庫,這裏是zlex.keystore
-file證書文件,這裏是zlex.crt
-storepass密鑰庫密碼,這裏是123456

如今證書也導出了,咱們能夠提取公鑰/私鑰,進行加密/解密,簽名/驗證操做了!固然,即使沒有證書,咱們也可以經過密鑰庫(JKS格式)文件得到證書,以及公鑰/私鑰、簽名算法等。

服務端JKS

keytool -import -v -trustcacerts -storepass 123456 -alias server -file server-cert.cer -keystore
server.jks

客戶端jks:

keytool -import -v -trustcacerts -storepass 123456 -alias client -file client-cert.cer -keystore
client.jks

本文參考

http://blog.csdn.net/boss666666/article/details/10284649
http://www.cnblogs.com/fivedragon/p/3997469.html
相關文章
相關標籤/搜索