java CA證書制作和代碼中使用

[TOC]

操作環(huán)境 window10 cmd

證書制作

xxx.keystore是秘鑰庫,存儲了公鑰和私鑰信息,一個秘鑰庫可以存儲多對的密鑰對(密鑰對可以理解為就是證書),通過alias別名來取出需要的密鑰對。xxx.cer證書只能存儲公鑰,可以從xxxx.keystore中導出某個密鑰對的公鑰證書。

生成keystore

//創(chuàng)建一個秘鑰庫名為,lu.keystore 同時創(chuàng)建一對密鑰對,別名是lisi   存入該秘鑰庫
PS F:\test\keystore> keytool -genkeypair -alias lisi -keystore lu.keystore -keyalg RSA
輸入密鑰庫口令:
再次輸入新口令:
您的名字與姓氏是什么?
  [Unknown]:  li
您的組織單位名稱是什么?
  [Unknown]:  li
您的組織名稱是什么?
  [Unknown]:  li
您所在的城市或區(qū)域名稱是什么?
  [Unknown]:  li
您所在的省/市/自治區(qū)名稱是什么?
  [Unknown]:  li
該單位的雙字母國家/地區(qū)代碼是什么?
  [Unknown]:  CN
CN=li, OU=li, O=li, L=li, ST=li, C=CN是否正確?
  [否]:  y

輸入 <lisi> 的密鑰口令
        (如果和密鑰庫口令相同, 按回車):
PS F:\test\keystore> ls


    目錄: F:\test\keystore


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         2018/7/3     15:07           2181 lu.keystore
        
//可用命令參數        
        
# -keyalg  指的是加密算法  證書的加密算法一般是DSA/RSA/EC,一般我們使用的都是RSA
# -alias   別名
# -validity指定有效期,單位為天,
# -keystore  指定秘鑰庫名稱,不指定默認生成.keystore
# -keysize 秘鑰大小  一般是1024和2048
# -storepass 證書庫的使用密碼,從里面提取公鑰時需要密碼
# -dname :CN擁有者名字,可以是跟網站相關的信息,如www.baidu.com,OU組織機構名 O組織名 L城市 ST州或省 C國家代碼      

命令執(zhí)行成功后,會在當前目錄生成lu.keystore文件

查看秘鑰庫信息

PS F:\test\keystore> keytool -list -keystore lu.keystore -v
輸入密鑰庫口令:

密鑰庫類型: JKS
密鑰庫提供方: SUN

您的密鑰庫包含 1 個條目

別名: lisi
創(chuàng)建日期: 2018-7-3
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
發(fā)布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
序列號: 38621ae3
有效期開始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
證書指紋:
         MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
         SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
         SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
         簽名算法名稱: SHA256withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
0010: B4 59 59 EA                                        .YY.
]
]



*******************************************
*******************************************

可以看到此時我們的秘鑰庫庫類型是JKS,里有一個密鑰對

導出公鑰證書

PS F:\test\keystore> keytool -exportcert -alias lisi -keystore lu.keystore -file lisi.cer
輸入密鑰庫口令:
存儲在文件 <lisi.cer> 中的證書
PS F:\test\keystore> ls


    目錄: F:\test\keystore


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         2018/7/3     15:16            831 lisi.cer
-a----         2018/7/3     15:07           2181 lu.keystore

將別名為lisi的密鑰對公鑰信息導出到lisi.cer,這便是我們看到的xxx.cer證書了,這個證書可以發(fā)布給任何人用于加密信息,而能夠解密的秘鑰保存在我們創(chuàng)建的lu.keystore中別名為lisi的證書中

使用一個證書給另一個證書簽名

前面我們生成了一個別名為lisi的證書,存儲在lu.keystore中,接下來再生成一個名為張三的證書,也存儲到lu.keystore

//步驟同創(chuàng)建lisi一樣
PS F:\test\keystore> keytool -genkeypair -alias zhangsan -keyalg RSA -keystore lu.keystore
xxxx
xxxx

//查看此時的秘鑰庫
PS F:\test\keystore> keytool -list -keystore lu.keystore -v
輸入密鑰庫口令:

密鑰庫類型: JKS
密鑰庫提供方: SUN

您的密鑰庫包含 2 個條目

別名: zhangsan
創(chuàng)建日期: 2018-7-3
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=zh, OU=zh, O=zh, L=zh, ST=zh, C=CN
發(fā)布者: CN=zh, OU=zh, O=zh, L=zh, ST=zh, C=CN
序列號: 2684e96b
有效期開始日期: Tue Jul 03 15:24:00 CST 2018, 截止日期: Mon Oct 01 15:24:00 CST 2018
證書指紋:
         MD5: 8D:EA:0F:F7:E9:9E:41:34:CD:97:0C:C7:29:B5:8D:3F
         SHA1: DF:C7:03:D1:8E:BA:9F:E7:DA:FA:07:2E:57:FC:DB:7F:70:BB:FE:2B
         SHA256: 19:A2:F2:AB:EF:A8:91:89:79:F2:70:17:AA:B5:AD:04:84:3B:D4:49:40:14:C3:C9:AC:20:16:CA:44:95:C7:B9
         簽名算法名稱: SHA256withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4E 24 A9 98 60 E1 7F 46   FC CF 29 1A D3 AE D5 52  N$..`..F..)....R
0010: D2 B3 B5 31                                        ...1
]
]



*******************************************
*******************************************


別名: lisi
創(chuàng)建日期: 2018-7-3
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
發(fā)布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
序列號: 38621ae3
有效期開始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
證書指紋:
         MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
         SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
         SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
         簽名算法名稱: SHA256withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
0010: B4 59 59 EA                                        .YY.
]
]



*******************************************
*******************************************

可以看到此時秘鑰庫里面已經有兩個條目了(兩個證書)我們接下來用lisi證書給張三證書簽名(即認證過程)

//創(chuàng)建一個certreq 信息存儲在zhangsan.csr
PS F:\test\keystore> keytool -certreq -alias zhangsan -keystore lu.keystore -file zhangsan.csr
輸入密鑰庫口令:
PS F:\test\keystore> ls


    目錄: F:\test\keystore


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         2018/7/3     15:16            831 lisi.cer
-a----         2018/7/3     15:24           4334 lu.keystore
-a----         2018/7/3     15:28           1058 zhangsan.csr

//使用創(chuàng)建的zhangsan.csr向lisi發(fā)起認證,最終生成需要的證書zhangsan.cer
PS F:\test\keystore> keytool -gencert -alias lisi -keystore lu.keystore -infile zhangsan.csr -outfile zhangsan.cer
輸入密鑰庫口令:
PS F:\test\keystore> ls


    目錄: F:\test\keystore


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         2018/7/3     15:16            831 lisi.cer
-a----         2018/7/3     15:24           4334 lu.keystore
-a----         2018/7/3     15:29            864 zhangsan.cer
-a----         2018/7/3     15:28           1058 zhangsan.csr

//將被認證過的證書zhangsan.cer導入到zhangsan證書中,完成認證
PS F:\test\keystore> keytool -importcert -alias zhangsan -keystore lu.keystore -file zhangsan.cer
輸入密鑰庫口令:
證書回復已安裝在密鑰庫中

上面三步驟完成后,證書zhangsan就已經被證書lisi認證,再查看秘鑰庫的信息:

PS F:\test\keystore> keytool -list -keystore lu.keystore -v
輸入密鑰庫口令:

密鑰庫類型: JKS
密鑰庫提供方: SUN

您的密鑰庫包含 2 個條目

別名: zhangsan
創(chuàng)建日期: 2018-7-3
條目類型: PrivateKeyEntry
證書鏈長度: 2
證書[1]:
所有者: CN=zh, OU=zh, O=zh, L=zh, ST=zh, C=CN
發(fā)布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
序列號: e3abce9
有效期開始日期: Tue Jul 03 15:29:10 CST 2018, 截止日期: Mon Oct 01 15:29:10 CST 2018
證書指紋:
         MD5: 17:BE:4C:2A:91:67:DB:07:83:2C:37:AA:E0:BB:22:AA
         SHA1: A9:67:85:5D:8E:47:F2:A9:D3:08:69:28:66:32:5B:25:FF:38:56:C4
         SHA256: CC:7D:18:11:D0:F8:F8:2F:83:64:32:45:DD:18:D6:C4:54:AF:3C:6F:16:10:A7:C4:BF:81:4C:3F:7D:12:45:49
         簽名算法名稱: SHA256withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
0010: B4 59 59 EA                                        .YY.
]
]

#2: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 4E 24 A9 98 60 E1 7F 46   FC CF 29 1A D3 AE D5 52  N$..`..F..)....R
0010: D2 B3 B5 31                                        ...1
]
]

證書[2]:
所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
發(fā)布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
序列號: 38621ae3
有效期開始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
證書指紋:
         MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
         SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
         SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
         簽名算法名稱: SHA256withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
0010: B4 59 59 EA                                        .YY.
]
]



*******************************************
*******************************************


別名: lisi
創(chuàng)建日期: 2018-7-3
條目類型: PrivateKeyEntry
證書鏈長度: 1
證書[1]:
所有者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
發(fā)布者: CN=li, OU=li, O=li, L=li, ST=li, C=CN
序列號: 38621ae3
有效期開始日期: Tue Jul 03 15:07:06 CST 2018, 截止日期: Mon Oct 01 15:07:06 CST 2018
證書指紋:
         MD5: 36:00:EE:28:26:4C:24:15:C7:39:D7:87:84:0D:A9:14
         SHA1: 8C:88:1E:97:DA:49:1F:BA:0E:5F:13:77:7C:6C:F3:F6:13:0C:C1:51
         SHA256: C2:99:AB:0A:66:6E:68:71:EF:A2:A9:1A:8F:07:60:35:18:D2:E1:3F:B1:B9:21:72:D8:3D:51:0C:52:43:DA:81
         簽名算法名稱: SHA256withRSA
         版本: 3

擴展:

#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: B5 56 CD 9D 4E 92 84 2C   2B 39 64 14 2C 93 93 28  .V..N..,+9d.,..(
0010: B4 59 59 EA                                        .YY.
]
]



*******************************************
*******************************************

注意觀察條目zhangsan證書的發(fā)布者已經變成了lisi的信息了,并且多了一個證書[2]:,這個就是頒發(fā)者的信息

證書加密和解密操作代碼實現

@org.junit.Test
public void testCertificate() throws Exception {
    final String alias = "lisi";
    final String keystore_password = "123456";//秘鑰庫密碼
    final String ca_password = "123456";//證書密碼
    
    
    //公鑰證書的編碼格式是x509  私鑰通常是pkcs8
    /*從lisi.cer中提取公鑰*/
    X509Certificate x509Certificate = null;
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
    FileInputStream fis = new FileInputStream("F://test/keystore/lisi.cer");
    x509Certificate = (X509Certificate) certificateFactory.generateCertificate(fis);
    fis.close();
    
    /*==========使用公鑰加密============*/
    Key key = x509Certificate.getPublicKey();
    Cipher cipher = Cipher.getInstance("RSA");
    cipher.init(Cipher.ENCRYPT_MODE, key);
    byte[] bytes = cipher.doFinal("helloworld".getBytes());
    System.out.println("加密結果: " + Base64.getEncoder().encodeToString(bytes));


    /*提取秘鑰*/
    fis = new FileInputStream("F://test/keystore/lu.keystore");
    KeyStore keyStore = KeyStore.getInstance("JKS");
    keyStore.load(fis, keystore_password.toCharArray());
    fis.close();

    PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, ca_password.toCharArray());

    /*=======使用私鑰解密=========*/
    cipher.init(Cipher.DECRYPT_MODE, privateKey);
    bytes = cipher.doFinal(bytes);
    System.out.println("解密: " + new String(bytes));
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 本文轉載,出處如下:數字證書原理 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明了...
    隨安居士閱讀 1,806評論 1 8
  • 數字證書就是網絡通訊中標志通訊各方身份信息的一系列數據,其作用類似于現實生活中的身份證。它是由一個權威機構發(fā)行的,...
    拉肚閱讀 21,687評論 1 17
  • 數字證書原理 - 無恙 - 博客園 文中首先解釋了加密解密的一些基礎知識和概念,然后通過一個加密通信過程的例子說明...
    拉肚閱讀 1,765評論 0 3
  • Android 中簽名 加密和HTTPS 一 RSA 加密算法 1. 非對稱加密算法 1976年,兩位美國計算機學...
    赤兔歡閱讀 2,674評論 0 0
  • 服務器https配置 配置https操作說明文檔 1、查看服務器環(huán)境配置(tomcat和apache合并使用) 2...
    南京楊小兵閱讀 9,249評論 0 9

友情鏈接更多精彩內容