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
暫時寫這麼多,後續根據使用情況補充。