使用keytool 生成證書
keytool 簡介
keytool 是java 用于管理密鑰和證書的工具,官方文檔
其功能包括:
- 創建并管理密鑰
- 創建并管理證書
- 作為CA 為證書授權
- 導入導出證書
主要格式
keytool 采用 keystore 文件來存儲密鑰及證書,其中可包括私鑰、信任證書;
keystore 文件主要使用 JKS格式(也可支持其他格式),帶密鑰存儲;其中私鑰的存儲也有獨立的密碼;
其他格式
一、生成私鑰和證書
keytool -genkeypair -alias serverkey -keystore server.keystore
按提示 輸入keystore 存儲密碼、私鑰密碼、個人信息,之后會生成 server.keystore文件
若不想輸入參數,可提供參數:
keytool -genkeypair -alias serverkey -keypass 111111 -storepass 111111 \ -dname "C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" \ -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore
參數說明
- storepass keystore 文件存儲密碼
- keypass 私鑰加解密密碼
- alias 實體別名(包括證書私鑰)
- dname 證書個人信息
- keyalt 采用公鑰算法,默認是DSA
- keysize 密鑰長度(DSA算法對應的默認算法是sha1withDSA,不支持2048長度,此時需指定RSA)
- validity 有效期
- keystore 指定keystore文件
二、查看keystore詳情
查看詳情命令
keytool -list -keystore -storepass 111111 server.keystore
輸出結果
Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry serverkey, Sep 25, 2016, PrivateKeyEntry, Certificate fingerprint (SHA1): 65:75:C9:08:A0:83:21:A1:D7:8D:DA:CD:3D:FB:C2:E0:50:96:29:62
加上-v選項可查看更詳細信息
Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry Alias name: serverkey Creation date: Jul 22, 2017 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: C=CN, ST=GD, L=SZ, O=vihoo, OU=dev, CN=vihoo.com Issuer: C=CN, ST=GD, L=SZ, O=vihoo, OU=dev, CN=vihoo.com Serial number: 5c5eb42 Valid from: Sat Jul 22 10:45:45 CST 2017 until: Tue Jul 20 10:45:45 CST 2027 Certificate fingerprints: MD5: 27:ED:70:EF:4C:E3:7F:ED:6A:83:67:32:6D:10:24:38 SHA1: 79:08:97:6E:62:EE:0F:E6:81:56:66:43:9C:9D:A4:11:EF:CC:28:0C SHA256: 3B:AC:56:8E:60:C2:C8:07:61:19:C7:4A:D3:AF:1F:60:77:24:94:7C:87:6E:C8:E7:17:14:E4:7A:34:0A:CD:8F Signature algorithm name: SHA256withRSA Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: B4 10 A9 26 5D 6C 4C 46 B4 69 ED 31 2B 20 D1 F4 ...&]lLF.i.1+ .. 0010: 58 3C 8F 94 X<.. ] ]
三、證書導入導出
導出證書
keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -storepass 111111
參數說明
- exportcert 表示導出證書
- alias 指示別名
- file 指示導出文件
- storepass 指示keystore密鑰
此時導出的證書為DER編碼格式,使用openssl 可以輸出
openssl x509 -in server.cer -inform der -noout -text
加上 -rfc選項,可輸出PEM編碼格式的證書
keytool -exportcert -keystore server.keystore -rfc -file server.cer -alias serverkey -storepass 111111
輸出格式如:
-----BEGIN CERTIFICATE-----
MIIDUTCCAjmgAwIBAgIEBcXrQjANBgkqhkiG9w0BAQsFADBZMRIwEAYDVQQDEwl2
...
-----END CERTIFICATE-----
導入證書
一般為導入信任證書(SSL客戶端使用)
keytool -importcert -keystore client_trust.keystore -file server.cer -alias client_trust_server -storepass 111111 -noprompt
參數說明
- importcert 表示導入信任證書
- file 指示導入證書,支持pem/der格式
- keystore 指示目標keystore文件
- storepass 指示新的keystore密鑰
- alias 指示trust證書在keystore中的別名
- noprompt 指示不彈出提示
導入后的證書為 trustedCertEntry 實體類型,而私鑰證書為 PrivateKeyEntry
四、查看證書
打印證書
keytool -printcert -file server.cer
輸出
Owner: CN=ZZ, OU=DEV, O=pp.com, L=GZ, ST=GD, C=CN Issuer: CN=ZZ, OU=DEV, O=pp.com, L=GZ, ST=GD, C=CN Serial number: 797f3140 Valid from: Sun Sep 25 16:43:55 CST 2016 until: Sat Dec 24 16:43:55 CST 2016 Certificate fingerprints: MD5: FB:7D:29:4C:A9:F3:07:0E:CC:74:0D:9B:D4:D6:4D:91 SHA1: 65:75:C9:08:A0:83:21:A1:D7:8D:DA:CD:3D:FB:C2:E0:50:96:29:62 SHA256: E9:8B:A5:43:5F:40:FA:C5:64:3B:0A:11:1D:BE:D1:07:3C:A1:E2:50:88:71:A7:5C:EC:43:22:98:1B:AA:B6:EB Signature algorithm name: SHA1withDSA Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 0E C3 62 D3 75 3A 3C B7 D9 C4 BD 8E 63 E7 6C EC ..b.u:<.....c.l. 0010: AF 8A 29 72 ..)r ] ]
五、轉換格式
jks格式 轉 pkcs12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 -srcalias serverkey -destalias serverkey \ -srcstoretype jks -deststoretype pkcs12 -srcstorepass 111111 -deststorepass 111111 -noprompt
參數說明
- importkeystore 指示導入導出keystore文件,可用于同類型或不同類型的導入導出
- srckeystore 指示源keystore文件
- srcalias 指示源實體別名
- srcstoretype 指示源store類型(jks/pkcs12..)
- srcstorepass 指示源store密碼
- noprompt 不彈出提示
pkcs12 轉jks格式與此同理
六、場景示例
1. 制作Java SSL 雙向證書
storepass=111111 keypass=111111 server_dname="C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihoo.com" client_dname="C=CN,ST=GD,L=SZ,O=vihoo,OU=dev,CN=vihooc.com" echo "generate server keystore" keytool -genkeypair -alias serverkey -keypass $keypass -storepass $storepass \ -dname $server_dname \ -keyalg RSA -keysize 2048 -validity 3650 -keystore server.keystore echo "generate client keystore" keytool -genkeypair -alias clientkey -keypass $keypass -storepass $storepass \ -dname $client_dname \ -keyalg RSA -keysize 2048 -validity 3650 -keystore client.keystore echo "export server certificate" keytool -exportcert -keystore server.keystore -file server.cer -alias serverkey -storepass $storepass echo "export client certificate" keytool -exportcert -keystore client.keystore -file client.cer -alias clientkey -storepass $storepass echo "add server cert to client trust keystore" keytool -importcert -keystore client_trust.keystore -file server.cer -alias client_trust_server \ -storepass $storepass -noprompt echo "add client cert to server trust keystore" keytool -importcert -keystore server_trust.keystore -file client.cer -alias server_trust_client \ -storepass $storepass -noprompt
2. Java 證書與 nginx 證書互轉
Java通常使用JKS作為證書存儲格式,而Nginx往往采用PEM證書格式,如何實現互轉?
Nginx 證書 轉 JKS
-
A pem證書和私鑰合成p12
注意定義-name 選項,這將作為keystore識別實體的參數openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 \ -name server -out server.p12
-
B p12 證書轉jks 證書
keytool -importkeystore -srckeystore server.p12 -destkeystore server.keystore \ -srcstoretype pkcs12 -deststoretype jks -srcalias server -destalias server \ -deststorepass 111111 -srcstorepass 111111
如果p12 文件中未指定實體名稱,使用keytool轉換時則不需提供srcalias/destalias參數,而輸出的keystore實體名稱默認為1
JKS 證書 轉 Nginx證書
-
A jks 證書轉p12
keytool -importkeystore -srckeystore server.keystore -destkeystore server.p12 \ -srcstoretype jks -deststoretype pkcs12 -srcalias server -destalias server \ -deststorepass 111111 -srcstorepass 111111
-
B p12 證書提取pem證書和私鑰
openssl pkcs12 -in server.p12 -clcerts -nokeys -password pass:111111 -out server.crt openssl pkcs12 -in server.p12 -nocerts -password pass:111111 -passout pass:111111 -out server.key
其中得到的私鑰文件為PKCS#8 加密格式,證書和密鑰均為PEM文件編碼。
3. 其他
已有的Nginx證書,如何快速在Java中添加信任
通過keytool -importcert 命令可直接導入信任證書
keytool 通用格式為 jks,如何獲取私鑰
通過程序讀取,參考stackoverflow
JavaSE樣例
作者: 美碼師(zale)
出處: http://www.rzrgm.cn/littleatp/, 如果喜歡我的文章,請關注我的公眾號
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接 如有問題, 可留言咨詢.
浙公網安備 33010602011771號