OpenSSL命令詳解
阿新 • • 發佈:2018-12-30
這一針在農信銀2代專案中有幸能碰到加密方面的東西,所以就好好學習了一下。不足之處還請前輩們見諒。
OpenSSL功能遠勝於KeyTool,可用於根證書,伺服器證書和客戶證書的管理 | |||||||||||||||||||||||
這裡使用的是Win32OpenSSL_Light-1_0_1e.exe | |||||||||||||||||||||||
http://www.slproweb.com/products/Win32OpenSSL.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),我們可以使用根證書籤發伺服器證書和客戶證書。 | |||||||||||||||||||||||
7,構建伺服器證書 | |||||||||||||||||||||||
伺服器證書的構建與根證書構建相似,首先需要構建私鑰。 | |||||||||||||||||||||||
(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編碼格式。完整命令如下 | |||||||||||||||||||||||
(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),並可使用該證書構建基於單向認證網路 | |||||||||||||||||||||||
(5)構建客戶證書 | |||||||||||||||||||||||
客戶證書的構建與伺服器證書構建基本一致,首先需要構建私鑰。 | |||||||||||||||||||||||
產生客戶私鑰 | |||||||||||||||||||||||
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位 | |||||||||||||||||||||||
完成客戶證書金鑰構建後,我們需要產生客戶證書籤發申請 | |||||||||||||||||||||||
(6)生成客戶證書籤發申請 | |||||||||||||||||||||||
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) | |||||||||||||||||||||||
(7)簽發客戶證書 | |||||||||||||||||||||||
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編碼格式。 | |||||||||||||||||||||||
(8)客戶證書轉換 | |||||||||||||||||||||||
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格式)檔案獲得證書,以及公鑰/私鑰、簽名演算法等。 |