keytool 是 Java 自帶的一個安全相關的工具,用於管理密鑰和證書;本文主要介紹其基本使用;文中所使用到的軟體版本:Java 1.8.0_321。 1、簡介 keytool 命令是一個密鑰和證書管理的工具。它允許用戶使用數字簽名管理自己的公鑰/私鑰對和相關證書,用於自我身份驗證(向其他用戶和 ...
keytool 是 Java 自帶的一個安全相關的工具,用於管理密鑰和證書;本文主要介紹其基本使用;文中所使用到的軟體版本:Java 1.8.0_321。
1、簡介
keytool 命令是一個密鑰和證書管理的工具。它允許用戶使用數字簽名管理自己的公鑰/私鑰對和相關證書,用於自我身份驗證(向其他用戶和服務驗證自己)或數據完整性和身份驗證服務。keytool 命令還允許用戶緩存通信對等體的公鑰(以證書的形式)。
證書是來自一個實體(個人、公司等)的數字簽名聲明,它表示實體的公鑰(和一些其他信息)具有特定的值。對數據進行數字簽名時,可以對簽名進行驗證,以驗證數據的完整性和真實性。完整性意味著數據沒有被修改或篡改,真實性意味著數據來自聲稱創建並簽名它的人。
keytool 命令還允許用戶管理對稱加密和解密中使用的秘密密鑰和口令。
keytool 命令將密鑰和證書存儲在keystore中。
2、用法
keytool [commands]
命令如下:
-certreq 生成證書請求 -changealias 更改條目的別名 -delete 刪除條目 -exportcert 導出證書 -genkeypair 生成密鑰對 -genseckey 生成密鑰 -gencert 根據證書請求生成證書 -importcert 導入證書或證書鏈 -importpass 導入口令 -importkeystore 從其他密鑰庫導入一個或所有條目 -keypasswd 更改條目的密鑰口令 -list 列出密鑰庫中的條目 -printcert 列印證書內容 -printcertreq 列印證書請求的內容 -printcrl 列印 CRL 文件的內容 -storepasswd 更改密鑰庫的存儲口令
可以使用如下命令查看每個命令的用法:
keytool -command_name -help
命令的參數有些是有預設值的,使用命令時可以不指定:
-alias "mykey" -keyalg "DSA" (when using -genkeypair) "DES" (when using -genseckey) -keysize 2048 (when using -genkeypair and -keyalg is "RSA") 1024 (when using -genkeypair and -keyalg is "DSA") 256 (when using -genkeypair and -keyalg is "EC") 56 (when using -genseckey and -keyalg is "DES") 168 (when using -genseckey and -keyalg is "DESede") -validity 90 -keystore <the file named .keystore in the user's home directory> -storetype <the value of the "keystore.type" property in the security properties file, which is returned by the static getDefaultType method in java.security.KeyStore> -file stdin (if reading) stdout (if writing) -protected false -sigalg "SHA256withDSA" (when the underlying private key is of type DSA) "SHA256withRSA" (when the underlying private key is of type RSA) "SHA256withECDSA" (when the underlying private key is of type EC)
3、具體使用
3.1、創建密鑰對
使用“keytool -genkeypair"命令會生成一個密鑰對(公鑰和私鑰)並將公鑰包裝到X.509 v3自簽名證書中,密鑰對存儲在以別名標識的條目中,條目類型為 PrivateKeyEntry。
使用命令 keytool -genkeypair -help 查看用法:
keytool -genkeypair [OPTION]... 生成密鑰對 選項: -alias <alias> 要處理的條目的別名 -keyalg <keyalg> 密鑰演算法名稱 -keysize <keysize> 密鑰位大小 -groupname <name> Group name. For example, an Elliptic Curve name. -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 通過受保護的機制的口令
下麵創建一個別名為 test1 的條目:
keytool -genkeypair -alias test1 -keyalg RSA -keystore /home/mongo/test.keystore -storetype pkcs12
註意:
1、如果指定的密鑰庫不存在,則會自動創建,需要設置密鑰庫口令;如果密鑰庫存在需要輸入密鑰口令。
2、如果創建預設類型(JKS)的密鑰庫,則可使用"-keypass"參數指定條目的密鑰口令,如果沒有指定則會在最後一步提示"輸入該條目的密鑰口令,(如果與密鑰庫口令相同按回車)",一般設為與密鑰庫口令相同。如果創建 PKCS12 類型的密鑰庫,則會忽略條目的密鑰口令參數,因為 PKCS12 不支持設置密鑰庫條目密鑰口令,預設它與密鑰庫密碼一致。
3.2、創建密鑰
keytool -genseckey -alias test1 -keystore /home/mongo/test2.keystore -storetype jceks
創建密鑰時,-storetype 需指定為 jceks,否則會報錯。
3.3、查看密鑰庫信息
keytool -list -v -keystore /home/mongo/test.keystore
指定密鑰庫的位置,查看該密鑰庫的條目信息。
3.4、導出證書
keytool -exportcert -keystore /home/mongo/test.keystore -alias test1 -file test1.cer
指定密鑰庫及需導出證書的條目,導出證書到指定的文件;執行命令後當前目錄下生成了 test1.cer 的證書文件。
3.5、列印證書內容
keytool -printcert -file test1.cer
也可以使用 -sslserver <server[:port]> 參數,直接從網路上列印某個 ssl server 的證書內容 。
3.6、導入證書
keytool -importcert -keystore /home/mongo/test.keystore -file test1.cer -alias test2
執行命令後會在密鑰庫中增加一個條目類型為 trustedCertEntry,別名為 test2 的條目。
3.7、刪除條目
keytool -delete -keystore /home/mongo/test.keystore -alias test2
執行命令後別名為 test2 的條目將被刪除。
3.8、簽發證書
先使用一個條目生成證書請求,再使用另外一個條目根據證書請求生成證書。
A、生成證書請求
keytool -certreq -keystore /home/mongo/test.keystore -alias test1 -file test1.csr
使用別名為 test1 的條目生成證書請求文件 test1.csr。
B、創建另一個密鑰對用於簽發證書
keytool -genkeypair -alias ca -keyalg RSA -keystore /home/mongo/test.keystore -storetype pkcs12
C、使用別名為 ca 的條目簽發證書
keytool -gencert -alias ca -keystore /home/mongo/test.keystore -infile test1.csr -outfile test2.cer
4、Java API 操作密鑰庫
可以通過 Java 代碼來訪問密鑰庫,讀取所需要的信息。
package com.abc.demo.general.keystore; import java.io.FileInputStream; import java.security.*; import java.security.cert.X509Certificate; public class KeystoreCase { public static void main(String[] args) throws Exception { KeyStore keyStore = loadKeyStore("pkcs12", "d:/test.keystore", "123456"); //讀取私鑰 PrivateKey privateKey = (PrivateKey) keyStore.getKey("test1", "123456".toCharArray()); System.out.println("privateKey:" + privateKey); //讀取證書 X509Certificate certificate = (X509Certificate)keyStore.getCertificate("test1"); System.out.println("certificate:" + certificate); //讀取公鑰 PublicKey publicKey = certificate.getPublicKey(); System.out.println("publicKey:" + publicKey); //獲得公鑰及私鑰後,就可以通過公鑰及私鑰進行加解密操作、簽名及驗簽操作。 } private static KeyStore loadKeyStore(String type, String filePath, String password) { KeyStore keySotre = null; try (FileInputStream in = new FileInputStream(filePath)) { keySotre = KeyStore.getInstance(type); keySotre.load(in, password.toCharArray()); } catch (Exception e) { e.printStackTrace(); } return keySotre; } }
參考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html#CHDFFCBG