加解密 生成 X.509格式,DER編碼,後綴名.cer。加密公鑰證書

參考 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的證書

Cmd代碼   收藏代碼
  1. 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這個密鑰庫裏面的全部證書

Cmd代碼   收藏代碼
  1. keytool -list -keystore test.keystore  


 

五.導出到證書文件

        範例:將名爲test.keystore的證書庫中別名爲test1的證書條目導出到證書文件test.crt中

Cmd代碼   收藏代碼
  1. keytool -export -alias test1 -file test.crt -keystore test.keystore  


        運行結果:在操做系統的用戶目錄(gacl)下生成了一個"test.crt"的文件,以下圖所示:



六.導入證書

        範例:將證書文件test.crt導入到名爲test_cacerts的證書庫中

Cmd代碼   收藏代碼
  1. 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的信息

Cmd代碼   收藏代碼
  1. keytool -printcert -file "test.crt"  

 

八.刪除密鑰庫中的條目

        範例:刪除密鑰庫test.keystore中別名爲test1的證書條目

Cmd代碼   收藏代碼
  1. keytool -delete -keystore test.keystore -alias test1  



九.修改證書條目的口令

        範例:將密鑰庫test.keystore中別名爲test2的證書條目的密碼修改成xdp123456

Cmd代碼   收藏代碼
  1. keytool -keypasswd -alias test2 -keystore test.keystore  



十.實戰命令

1.生成私鑰

Cmd代碼   收藏代碼
  1. keytool -genkey -alias aliasName -keyalg RSA -keysize 1024 -keypass 112233 -validity 1095 -keystore test1.ks -storepass 123456  

 

2.根據生成的私鑰導出公鑰

Cmd代碼   收藏代碼
  1. keytool -export -alias aliasName -keystore test1.ks -file test1.cer -storepass 123456  

 

3.查看證書

Cmd代碼   收藏代碼
  1. keytool -printcert -file /data/test1.cer  

 

4.導入公鑰證書

Cmd代碼   收藏代碼
  1. keytool -import -file /data/test1.cer -keystore cacerts -alias server  

 

5.查看密鑰庫裏面的證書

a.查看全部證書

Cmd代碼   收藏代碼
  1. keytool -list -keystore cacerts  

b.查看別名是server的證書

Cmd代碼   收藏代碼
  1. keytool -list -keystore cacerts | grep server  

c.根據證書的內容查看證書

Cmd代碼   收藏代碼
  1. 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下:

Java代碼   收藏代碼
  1. keytool -list -keystore D:\software\Java\jdk1.7.0_51\jre\lib\security\cacerts  
  2. 或者  
  3. keytool -list -keystore D:\software\Java\jdk1.7.0_51\jre\lib\security\cacerts | findstr /i server  
  4. 或者  
  5. keytool -list -keystore D:\software\Java\jdk1.7.0_51\jre\lib\security\cacerts | findstr /i entrust  

        輸入密鑰庫口令:  changeit

Text代碼   收藏代碼
  1. entrustevca, 2010-4-24, trustedCertEntry,  
  2. entrustrootcag2, 2010-6-23, trustedCertEntry,  
  3. entrust2048ca, 2010-6-23, trustedCertEntry,  
  4. entrustsslca, 2003-1-9, trustedCertEntry,  

 

6.刪除密鑰庫中的條目

Cmd代碼   收藏代碼
  1. keytool -delete -keystore cacerts equifaxsecureca  
相關文章
相關標籤/搜索