參考 html
https://bijian1013.iteye.com/blog/2310641 做證書的工具keytool用法總結java
https://314649444.iteye.com/blog/2076202算法
https://www.jianshu.com/p/d304e76270bewindows
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/keytool.html#keytool_option_gencertoracle
理解編輯器
關於keyGenerator,KeyPairGenerator,SecretKeyFactory的解析
Java加密的經常使用的加密算法類型有三種工具
1單向加密:也就是不可逆的加密,例如MD5,SHA,HMACui
2對稱加密:也就是加密方和解密方利用同一個祕鑰對數據進行加密和解密,例如DES,PBE等等編碼
3非對稱加密:非對稱加密分爲公鑰和祕鑰,兩者是非對稱的,例如用私鑰加密的內容須要使用公鑰來解密,使用公鑰加密的內容須要用私鑰來解密,DSA,RSA...加密
而keyGenerator,KeyPairGenerator,SecretKeyFactory的三種使用方法恰好和這三種加密算法類型對上
keyGenerator:祕鑰生成器,也就是更具算法類型隨機生成一個祕鑰,例如HMAC,因此這個大部分用在非可逆的算法中
SecretKeyFactory:祕密祕鑰工廠,言外之意就是須要根據一個祕密(password)去生成一個祕鑰,例如DES,PBE,因此大部分使用在對稱加密中
KeyPairGenerator:祕鑰對生成器,也就是能夠生成一對祕鑰,也就是公鑰和私鑰,因此大部分使用在非對稱加密中
轉
public static void main(String[] args) throws Exception { byte[] msg = "test!中文".getBytes("UTF8"); // 待加解密的消息 // 用證書的公鑰加密 CertificateFactory cff = CertificateFactory.getInstance("X.509"); FileInputStream fis1 = new FileInputStream("D:/test/zhongxin.cer"); // 證書文件 Certificate cf = cff.generateCertificate(fis1); PublicKey pk1 = cf.getPublicKey(); // 獲得證書文件攜帶的公鑰 Cipher c1 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); // 定義算法:RSA c1.init(Cipher.ENCRYPT_MODE, pk1); byte[] msg1 = c1.doFinal(msg); // 加密後的數據 // 用證書的私鑰解密 - 該私鑰存在生成該證書的密鑰庫中 FileInputStream fis2 = new FileInputStream("D:/test/c-abc.keystore"); KeyStore ks = KeyStore.getInstance("JKS"); // 加載證書庫 char[] kspwd = "123456".toCharArray(); // 證書庫密碼 char[] keypwd = "abcd1234".toCharArray(); // 證書密碼 ks.load(fis2, kspwd); // 加載證書 PrivateKey pk2 = (PrivateKey) ks.getKey("zhongxin", keypwd); // 獲取證書私鑰 fis2.close(); Cipher c2 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); c2.init(Cipher.DECRYPT_MODE, pk2); byte[] msg2 = c2.doFinal(msg1); // 解密後的數據 System.out.println(new String(msg2, "UTF8")); // 將解密數據轉爲字符串 String aaa=Base64.getEncoder().encodeToString(pk2.getEncoded()); System.out.println(aaa); PKCS8EncodedKeySpec spec =new PKCS8EncodedKeySpec(Base64.getDecoder().decode(aaa)); PrivateKey priva = KeyFactory.getInstance("RSA").generatePrivate(spec); Cipher cc2 = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cc2.init(Cipher.DECRYPT_MODE, priva); byte[] msg22 = cc2.doFinal(msg1); // 解密後的數據 System.out.println(new String(msg22, "UTF8")); // 將解密數據轉爲字符串 //aaa(); }
一.keytool的概念
keytool 是個密鑰和證書管理工具。它使用戶可以管理本身的公鑰/私鑰對及相關證書,用於(經過數字簽名)自我認證(用戶向別的用戶/服務認證本身)或數據完整性以及認證服務。在JDK 1.4之後的版本中都包含了這一工具,它的位置爲%JAVA_HOME%\bin\keytool.exe,以下圖所示:
二.keytool的用法
三.建立證書
建立證書主要是使用" -genkeypair",該命令的可用參數以下:
範例:生成一個名稱爲test1的證書
- keytool -genkeypair -alias "test1" -keyalg "RSA" -keystore "test.keystore"
功能:
建立一個別名爲test1的證書,該證書存放在名爲test.keystore的密鑰庫中,若test.keystore密鑰庫不存在則建立。
參數說明:
-genkeypair:生成一對非對稱密鑰;
-alias:指定密鑰對的別名,該別名是公開的;
-keyalg:指定加密算法,本例中的採用通用的RAS加密算法;
-keystore:密鑰庫的路徑及名稱,不指定的話,默認在操做系統的用戶目錄下生成一個".keystore"的文件
注意:
1.密鑰庫的密碼至少必須6個字符,能夠是純數字或者字母或者數字和字母的組合等等
2."名字與姓氏"應該是輸入域名,而不是咱們的我的姓名,其餘的能夠不填
執行完上述命令後,在操做系統的用戶目錄下生成了一個"test.keystore"的文件,以下圖所示:
四.查看密鑰庫裏面的證書
範例:查看test.keystore這個密鑰庫裏面的全部證書
- keytool -list -keystore test.keystore
五.導出到證書文件
範例:將名爲test.keystore的證書庫中別名爲test1的證書條目導出到證書文件test.crt中
- keytool -export -alias test1 -file test.crt -keystore test.keystore
運行結果:在操做系統的用戶目錄(gacl)下生成了一個"test.crt"的文件,以下圖所示:
六.導入證書
範例:將證書文件test.crt導入到名爲test_cacerts的證書庫中
- keytool -import -keystore test_cacerts -file test.crt
如導入證書報「keytool error: java.lang.Exception: Input not an X.509 certificate」異常,可用文本編輯器打開查看,如是亂碼,則應該是「DER 編碼二進制 X.509(.CER)(D)」證書,如是字母數字,則應該是"Base64 編碼 X.509(.CER)(D)」證書。
在這我用文本編輯器打開報「keytool error: java.lang.Exception: Input not an X.509 certificate」異常的證書,是亂碼的,應該是「DER 編碼二進制 X.509(.CER)(D)」證書,因而再經過雙擊打開導出"Base64 編碼 X.509(.CER)(D)」文件格式的證書,具體步驟以下:
單選"Base64 編碼 X.509(.CER)(D)」格式
點「完成」彈出導出成功提示框即OK,用文本編輯器打開導出的證書,能夠看到不是亂碼的(由字母和數字組成)。
再用keytool -export -alias test1 -file test.cer -keystore test.keystore導入證書,不報「keytool error: java.lang.Exception: Input not an X.509 certificate」異常。
七.查看證書信息
範例:查看證書文件test.crt的信息
- keytool -printcert -file "test.crt"
八.刪除密鑰庫中的條目
範例:刪除密鑰庫test.keystore中別名爲test1的證書條目
- keytool -delete -keystore test.keystore -alias test1
九.修改證書條目的口令
範例:將密鑰庫test.keystore中別名爲test2的證書條目的密碼修改成xdp123456
- keytool -keypasswd -alias test2 -keystore test.keystore
十.實戰命令
1.生成私鑰
- keytool -genkey -alias aliasName -keyalg RSA -keysize 1024 -keypass 112233 -validity 1095 -keystore test1.ks -storepass 123456
2.根據生成的私鑰導出公鑰
- keytool -export -alias aliasName -keystore test1.ks -file test1.cer -storepass 123456
3.查看證書
- keytool -printcert -file /data/test1.cer
4.導入公鑰證書
- keytool -import -file /data/test1.cer -keystore cacerts -alias server
5.查看密鑰庫裏面的證書
a.查看全部證書
- keytool -list -keystore cacerts
b.查看別名是server的證書
- keytool -list -keystore cacerts | grep server
c.根據證書的內容查看證書
- keytool -list -keystore cacerts | grep D0:DB:9A:68:FE:AE:2B:EE:84:8B:5B:D0:AD:D5:83:DA:D4:31:A1:6F
Windows下:
- keytool -list -keystore D:\software\Java\jdk1.7.0_51\jre\lib\security\cacerts
- 或者
- keytool -list -keystore D:\software\Java\jdk1.7.0_51\jre\lib\security\cacerts | findstr /i server
- 或者
- keytool -list -keystore D:\software\Java\jdk1.7.0_51\jre\lib\security\cacerts | findstr /i entrust
輸入密鑰庫口令: changeit
- entrustevca, 2010-4-24, trustedCertEntry,
- entrustrootcag2, 2010-6-23, trustedCertEntry,
- entrust2048ca, 2010-6-23, trustedCertEntry,
- entrustsslca, 2003-1-9, trustedCertEntry,
6.刪除密鑰庫中的條目
- keytool -delete -keystore cacerts equifaxsecureca