Java keytool 工具實戰總結

Keytool是什麼

安裝jdk之後默認就帶有keytool這個工具,使用which命令可以查看具體命令路徑。Keytool是一個簡單的操作ssl證書的小工具。

which keytool
keytool -help

非法選項:  -h
密鑰和證書管理工具

命令:

 -certreq            生成證書請求
 -changealias        更改條目的別名
 -delete             刪除條目
 -exportcert         導出證書
 -genkeypair         生成密鑰對
 -genseckey          生成密鑰
 -gencert            根據證書請求生成證書
 -importcert         導入證書或證書鏈
 -importpass         導入口令
 -importkeystore     從其他密鑰庫導入一個或所有條目
 -keypasswd          更改條目的密鑰口令
 -list               列出密鑰庫中的條目
 -printcert          打印證書內容
 -printcertreq       打印證書請求的內容
 -printcrl           打印 CRL 文件的內容
 -storepasswd        更改密鑰庫的存儲口令

使用 "keytool -command_name -help" 獲取 command_name 的用法

Keytool使用說明

  • 使用 keytool --help 可以查看相關幫助,如上圖展示了相關的可用子命令。可以通過 keytool subCmd --help 查看具體每個子命令支持的用法。keytool --help 展示的是子命令,具體 keytool subCmd --help 會展示支持的選項。
keytool -genkey --help

keytool -genkeypair [OPTION]...

生成密鑰對

選項:

 -alias <alias>                  要處理的條目的別名
 -keyalg <keyalg>                密鑰算法名稱
 -keysize <keysize>              密鑰位大小
 -sigalg <sigalg>                簽名算法名稱
 -destalias <destalias>          目標別名
 -dname <dname>                  唯一判別名
 -startdate <startdate>          證書有效期開始日期/時間
 -ext <value>                    X.509 擴展
 -validity <valDays>             有效天數
 -keypass <arg>                  密鑰口令
 -keystore <keystore>            密鑰庫名稱
 -storepass <arg>                密鑰庫口令
 -storetype <storetype>          密鑰庫類型
 -providername <providername>    提供方名稱
 -providerclass <providerclass>  提供方類名
 -providerarg <arg>              提供方參數
 -providerpath <pathlist>        提供方類路徑
 -v                              詳細輸出
 -protected                      通過受保護的機制的口令

使用 "keytool -help" 獲取所有可用命令
  • 如上圖,-genkey雖然沒有出現在列表中,但是通過 --help 可發現其表示的是 -genkeypair。類似的縮略還有幾個,此處不介紹(非必要)。

Keytool實戰

創建證書

keytool -genkey -keyalg RSA -keystore server.keystore.jks -alias localhost -validity 1
  • -genkey 是子命令,即創建密鑰對(私鑰+公鑰,其中公鑰本質即證書)。
  • -keyalg 指定算法
  • -keystore 指定密鑰本文件(keystore可以理解爲一個證書存儲文件,一個文件內可以存儲多個證書,每個證書使用一個alias標識)。每個keystore需要指定storepass進行基本的安全校驗,每個alias(證書/密鑰對)需要指定keypass用於基本的安全校驗。
  • -alias 指定本次創建的證書alias。
  • 注意storepass和keypass不指定會在輸入命令後通過交互方式輸入。指定的keystore文件不存在,則輸入的storepass爲新密碼,完成後會創建處store文件。若已存在,則輸入的storepass需通過校驗才能繼續。

查看證書

keytool -list --help

keytool -list [OPTION]...

列出密鑰庫中的條目

選項:

 -rfc                            以 RFC 樣式輸出
 -alias <alias>                  要處理的條目的別名
 -keystore <keystore>            密鑰庫名稱
 -storepass <arg>                密鑰庫口令
 -storetype <storetype>          密鑰庫類型
 -providername <providername>    提供方名稱
 -providerclass <providerclass>  提供方類名
 -providerarg <arg>              提供方參數
 -providerpath <pathlist>        提供方類路徑
 -v                              詳細輸出
 -protected                      通過受保護的機制的口令

keytool -list -v -keystore server.keystore.jks
  • 注意需要輸入storepass。

導出證書

  • 正如以上所說,store只是一個證書本。那麼證書本身是什麼樣的呢。
keytool -exportcert -keystore server.keystore.jks -alias localhost -file server.cer
  • 可以基於md5sum等指令驗證server.cer的指紋是否和keytool -list打印的指紋一致。
  • 需要注意的是,導出的證書不包含私鑰。所以務必記住:僅包含單個alias的keystore和其導出的cer文件是不對等的(一個是公私鑰對,另一個僅公鑰)。

導入證書

  • 既然可以從store導出證書,自然也可以導入。
  • keytool -import --help
    
    keytool -importcert [OPTION]...
    
    導入證書或證書鏈
    
    選項:
    
     -noprompt                       不提示
     -trustcacerts                   信任來自 cacerts 的證書
     -protected                      通過受保護的機制的口令
     -alias <alias>                  要處理的條目的別名
     -file <filename>                輸入文件名
     -keypass <arg>                  密鑰口令
     -keystore <keystore>            密鑰庫名稱
     -storepass <arg>                密鑰庫口令
     -storetype <storetype>          密鑰庫類型
     -providername <providername>    提供方名稱
     -providerclass <providerclass>  提供方類名
     -providerarg <arg>              提供方參數
     -providerpath <pathlist>        提供方類路徑
     -v                              詳細輸出
    
    keytool -import -keystore server.keystore.jks -alias localhost3 -file server.cer
    
    輸入密鑰庫口令:
    在別名 <localhost> 之下, 證書已經存在於密鑰庫中
    是否仍要添加? [否]:  y
    證書已添加到密鑰庫中
    
    keytool -list -keystore server.keystore.jks
    
    輸入密鑰庫口令:
    
    密鑰庫類型: JKS
    密鑰庫提供方: SUN
    
    您的密鑰庫包含 3 個條目
    
    localhost3, 2019-11-22, trustedCertEntry,
    證書指紋 (SHA1): 54:16:B5:FB:DC:E8:3B:F1:59:77:F2:5D:01:84:6B:06:84:7C:D0:FB
    localhost2, 2019-11-22, PrivateKeyEntry,
    證書指紋 (SHA1): 78:C9:08:4F:A3:3C:24:39:44:4C:99:23:B0:1B:01:46:CF:EC:37:44
    localhost, 2019-11-22, PrivateKeyEntry,
    證書指紋 (SHA1): 54:16:B5:FB:DC:E8:3B:F1:59:77:F2:5D:01:84:6B:06:84:7C:D0:FB
  • 正如之前所講,keystore和cer文件不對等,那麼此處導入的僅僅是cer文件,和原先keystore中保存的還一樣嘛。答案:不一樣。如上圖所示,localhost、localhost2、localhost3的類型並不一樣。localhost和localhost2是PrivateKeyEntry,而localhost3是trustedCertEntry。
  • PrivateKeyEntry的轉移需要通過 keytool -importkeystore 指令操作。
  • 打印和查看證書

  • keytool -printcert --help
    
    keytool -printcert [OPTION]...
    
    打印證書內容
    
    選項:
    
     -rfc                        以 RFC 樣式輸出
     -file <filename>            輸入文件名
     -sslserver <server[:port]>  SSL 服務器主機和端口
     -jarfile <filename>         已簽名的 jar 文件
     -v                          詳細輸出
    
    keytool -printcert -file server.cer
    
    所有者: CN=zhao, OU=baidu, O=baidu_org, L=shanghai, ST=shanghai, C=cn
    發佈者: CN=zhao, OU=baidu, O=baidu_org, L=shanghai, ST=shanghai, C=cn
    序列號: 6c7d478d
    有效期開始日期: Fri Nov 22 17:22:07 CST 2019, 截止日期: Sat Nov 23 17:22:07 CST 2019
    證書指紋:
             MD5: 27:F5:53:43:9C:3B:34:9E:57:1B:16:9B:C2:D9:BF:D6
             SHA1: 54:16:B5:FB:DC:E8:3B:F1:59:77:F2:5D:01:84:6B:06:84:7C:D0:FB
             SHA256: 45:A3:76:1B:3C:63:FF:AC:DF:04:7B:14:53:27:1E:E8:0B:5A:CC:6A:6E:AD:6A:73:D2:D4:AC:58:E5:19:2B:28
             簽名算法名稱: SHA256withRSA
             版本: 3
    
    擴展:
    
    #1: ObjectId: 2.5.29.14 Criticality=false
    SubjectKeyIdentifier [
    KeyIdentifier [
    0000: 29 A6 40 94 4F E4 08 0E   6D CB 3E 71 15 F2 ED 45  )[email protected].>q...E
    0010: E6 FB 98 5B                                        ...[
    ]
    ]
  • 導出單獨的key和cer文件

  • 以上演示了導出cer文件,但是keytool默認無法導出key文件。首先我們需要轉換爲另外一種格式的store(即pkcs12)。
  •  keytool -importkeystore -srcstoretype jks -srckeystore server/server.keystore.jks -deststoretype pkcs12 -destkeystore server/server.keystore.p12 -srcstorepass storepasswd -deststorepass storepasswd -srcalias kafka-server -srckeypass kafka-passwd -destkeypass storepasswd
  • 注意,大多數工具對pkcs12格式的keystore要求storepass和keypass一致。因此需要指定同一個值,否則如上命令會報錯。因此,爲了統一管理,有時候即使是jks的store,我們也可以考慮將storepass和keypass設置爲相同值。
  • openssl pkcs12 -nodes -in server/server.keystore.p12 -out server/server.pem

     

暫時寫這麼多,後續根據使用情況補充。

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章