天天看點

使用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
    openssl pkcs12 -export -in server.crt -inkey server.key -passin pass:111111 -password pass:111111 \
    -name server -out server.p12      
    注意定義-name 選項,這将作為keystore識别實體的參數
  • 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樣例
使用keytool 生成證書

作者:

zale

出處:

http://www.cnblogs.com/littleatp/

, 如果喜歡我的文章,請

關注我的公衆号

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出

原文連結

 如有問題, 可留言咨詢.