日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

java常见证书类型和密钥库类型

發布時間:2024/4/24 综合教程 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 java常见证书类型和密钥库类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 。證書類型

1》證書概念:

證書是對現實生活中 某個人或者某件物品的價值體現 比如古董頒發見證書 ,人頒發獻血證等 通常證書會包含以下內容

證書擁有者名稱(CN),組織單位(OU)組織(O),城市(L) 區(ST) 國家/地區( C )

證書的過期時間 證書的頒發機構 證書頒發機構對證書的簽名,簽名算法,對象的公鑰等

數字證書的格式遵循X.509標準。X.509是由國際電信聯盟(ITU-T)制定的數字證書標準。

2》證書類型(表格采集自網絡)

格式

擴展名

描述

特點

DER

.cer/.crt/.rsa

【ASN
.1 DER】用于存放證書

不含私鑰、二進制

PKCS7

.p7b/.p7r

【PKCS
#7】加密信息語法標準

1、p7b以樹狀展示證書鏈,不含私鑰
2、p7r為CA對證書請求簽名的回復,只能用于導入

CMS

.p7c/.p7m/.p7s

【Cryptographic
Message Syntax】

1、p7c只保存證書
2、p7m:signature
with enveloped data
3、p7s:時間戳簽名文件

PEM

.pem

【Printable
Encoded Message】

1、該編碼格式在RFC1421中定義,其實PEM是

【Privacy-Enhanced
Mail】的簡寫,但他也同樣廣泛運用于密鑰管理
2、ASCII文件
3、一般基于base
64編碼

PKCS10

.p10/.csr

【PKCS
#10】公鑰加密標準【Certificate Signing Request】

1、證書簽名請求文件
2、ASCII文件
3、CA簽名后以p7r文件回復

SPC

.pvk/.spc

【Software
Publishing Certificate】

微軟公司特有的雙證書文件格式,經常用于代碼簽名,其中
1、pvk用于保存私鑰
2、spc用于保存公鑰


二。密鑰庫類型

1》秘鑰庫概念:所有的公鑰和私鑰同證書都會被存儲在密鑰庫中 因為證書需要被簽名 簽名必須使用非對稱加密算法+HASH算法 所以

一般是MD5WithRSA或者 SHA1WithRSA(表格采集自網絡)

格式

擴展名

描述

特點

JKS

.jks/.ks

【Java
Keystore】密鑰庫的Java實現版本,provider為SUN

密鑰庫和私鑰用不同的密碼進行保護

JCEKS

.jce

【JCE
Keystore】密鑰庫的JCE實現版本,provider為SUN
JCE

相對于JKS安全級別更高,保護Keystore私鑰

時采用TripleDES

PKCS12

.p12/.pfx

【PKCS
#12】個人信息交換語法標準

1、包含私鑰、公鑰及其證書
2、密鑰庫和私鑰用相同密碼進行保護

BKS

.bks

【Bouncycastle
Keystore】密鑰庫的BC實現版本,provider為BC

基于JCE實現

UBER

.ubr

【Bouncycastle
UBER Keystore】密鑰庫的BC更安全實現版本,provider為BC


三。使用java的keytool生成證書

生成證書以及證書對應的公鑰和私鑰都可以被存儲在秘鑰庫中 同一個秘鑰庫中可以存儲多個證書 秘鑰庫必須設置一個訪問的口令 防止被盜

證書中包含公鑰 證書和私鑰如果需要單獨存儲 需要分開在不同的文件 也可以放在同一個秘鑰庫中

秘鑰庫可以單獨存儲證書條目(trustedCertEntry) 表示信任的證書,
秘鑰庫可以存儲生成的證書和私鑰(PrivateKeyEntry)

keytool /?查看所有的子命令

C:Usersjiaozi>keytool
密鑰和證書管理工具

命令:

 -certreq            生成證書請求
 -changealias        更改條目的別名
 -delete             刪除條目
 -exportcert         導出證書
 -genkeypair         生成密鑰對
 -genseckey          生成密鑰
 -gencert            根據證書請求生成證書
 -importcert         導入證書或證書鏈
 -importkeystore     從其他密鑰庫導入一個或所有條目
 -keypasswd          更改條目的密鑰口令
 -list               列出密鑰庫中的條目
 -printcert          打印證書內容
 -printcertreq       打印證書請求的內容
 -printcrl           打印 CRL 文件的內容
 -storepasswd        更改密鑰庫的存儲口令

keytool -genkeypair /?查看genkeypair的子命令

C:Usersjiaozi>keytool -genkeypair /?
非法選項:  a
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 -genkeypair -alias 被存儲在秘鑰庫的證書名稱 -keystore 證書的位置(默認當前工作目錄下 文件名 .keystore) -storepass 密鑰庫的口令

-validity 有效期的天數 -keypass 秘鑰口令

例如(輸入證書擁有者個人信息)

keytool -genkeypair -keystore c:/a.keystore -alias test

再增加一個證書

keytool -genkeypair -keystore c:/a.keystore -alias test1

》》查看密鑰庫的證書列表(密續輸入秘鑰庫的密碼才能查看) java默認的密鑰庫為JKS

keytool  -list -keystore c:/a.keystore -storepass 123456

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

您的密鑰庫包含 2 個條目

test, 2017-7-24, PrivateKeyEntry,
證書指紋 (SHA1): DD:34:11:3F:2C:D8:6B:4D:71:F5:C9:40:E9:91:7E:A9:9A:C5:9E:9D
test1, 2017-7-24, PrivateKeyEntry,
證書指紋 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9

》》導出證書到單獨證書文件(可以導出別名為test或者test1的證書)

C:Usersjiaozi>keytool  -exportcert -alias test -file c:/a.cer -keystore c:/a.k
eystore -storepass 123456
存儲在文件 <c:/a.cer> 中的證書

》》添加證書到秘鑰庫中

C:Usersjiaozi>keytool  -importcert -alias test2 -file c:/a.cer -keystore c:/a.
keystore -storepass 123456
在別名 <test> 之下, 證書已經存在于密鑰庫中
是否仍要添加? [否]:  y
證書已添加到密鑰庫中

C:Usersjiaozi>keytool  -list -keystore c:/a.keystore -storepass 123456
密鑰庫類型: JKS
密鑰庫提供方: SUN
您的密鑰庫包含 3 個條目
test, 2017-7-24, PrivateKeyEntry,
證書指紋 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9
test1, 2017-7-24, PrivateKeyEntry,
證書指紋 (SHA1): DD:34:11:3F:2C:D8:6B:4D:71:F5:C9:40:E9:91:7E:A9:9A:C5:9E:9D
test2, 2017-7-24,trustedCertEntry ,
證書指紋 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9

》》數據證書簽發申請 csr

首先 假設生成一個根證書 默認是自己頒發給自己也就是自簽名證書

C:Usersjiaozi>keytool -genkeypair -keystore c:/root.keystopre
輸入密鑰庫口令:
再次輸入新口令:
您的名字與姓氏是什么?
  [Unknown]:  jiaozi
您的組織單位名稱是什么?
  [Unknown]:  yt
您的組織名稱是什么?
  [Unknown]:  ytgroup
您所在的城市或區域名稱是什么?
  [Unknown]:  zh_CN
您所在的省/市/自治區名稱是什么?
  [Unknown]:  gd
該單位的雙字母國家/地區代碼是什么?
  [Unknown]:  china
CN=jiaozi, OU=yt, O=ytgroup, L=zh_CN, ST=gd, C=china是否正確?
  [否]:  y

輸入 <mykey> 的密鑰口令
        (如果和密鑰庫口令相同, 按回車):

C:Usersjiaozi>keytool -list -keystore c:/root.keystopre
輸入密鑰庫口令:

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

您的密鑰庫包含 1 個條目

mykey, 2017-7-24, PrivateKeyEntry,
證書指紋 (SHA1): 0F:E3:40:B2:B8:D0:7A:D2:91:7D:CC:E5:38:16:96:D8:C8:FF:05:E0

使用該證書簽發其他的證書

1》創建一個需要被root簽名的證書 同上(默認的別名是mykey 輸入名字和姓氏為p2p)

keytool -genkeypair -keystore c:/my.keystopre

2》創建證書請求(也就是將my.keystore中創建的證書 進行簽名請求 該文件時csr文件)

keytool -certreq -alias mykey -keystore c:my.keystore -file c:my.csr

3》需要將my.csr 通過root.keystore證書簽名 生成新的證書

keytool -gencert -alias mykey -keystore c:oot.keystore -infile
c:my.csr -outfil
e c:my.cer

雙擊my.cer可以看到 確實是根證書的jiaozi頒發給了被簽名證書的p2p

證書路徑確沒有顯示正確的結構 應該是jiaozi下的子節點是p2p 這里是因為根節點沒有被系統信任

需要將根證書導入到系統受信任的頒發機構中 以后所有根證書簽發的證書都是被信任的

導出root.keystore中的根證書

keytool -exportcert -keystore root.keystore -file c:ootca.cer

設置如下:

打開chrome瀏覽器 選擇 選項或者設置 點擊高級 管理證書選項 點開 收信任的根證書頒發機構 點擊左下角導入 下一步 選擇 被簽名的

導入成功后可以看到

》》給jar包簽名(jarsigner -keystore c:oot.keystore 被簽名jar的路徑 keystore中的別名)

jarsigner -keystore c:oot.keystore ref.jar mykey 簽名后META-INF 會生成一些文件 其實就是對類進行的摘要 這個會直接在jar包本省簽名

-signedjar ref1.jar 可以指定生成一個新的jar包

》》其他命令 比如從密鑰庫刪除條目等參考幫助

四。使用java編碼操作證書和密鑰庫

/**
	 *java默認密鑰庫為jks 支持PKCS12,JCEKS等
	 *JCEKS支持 秘鑰 支持信任證書和私鑰 
	 *JKS和PKCS支持信任證書和私鑰 不支持單獨秘鑰
	 * @throws NoSuchAlgorithmException 
	 */
	public static void main(String[] args) throws Exception {
		KeyStore keyStore = KeyStore.getInstance("JCEKS");
		keyStore.load(null,null);
		KeyGenerator keyGen = KeyGenerator.getInstance("AES");
		keyGen.init(128);//128, 192 or 256
		SecretKey sk=keyGen.generateKey();
		//單獨只是存儲一個秘鑰 如果是JKS和PKCS 會拋出錯誤 不支持單獨秘鑰
		keyStore.setKeyEntry("key1", sk, "123456".toCharArray(), null);
		//存儲信任的證書
		InputStream is=new FileInputStream("c:/a.cer");
		CertificateFactory cf = CertificateFactory.getInstance("X.509");
		X509Certificate cert = (X509Certificate)cf.generateCertificate(is);
		keyStore.setCertificateEntry("cert1", cert);
		//存儲非對稱加密的證書和私鑰
		CertAndKeyGen gen = new CertAndKeyGen("RSA","SHA1WithRSA");
	    gen.generate(1024);
	    X509Certificate mycert=gen.getSelfCertificate(new X500Name("CN=ROOT"), (long)365*24*3600);
	    PrivateKey pk=gen.getPrivateKey();
	    keyStore.setKeyEntry("myrsa", pk, "123456".toCharArray(),new Certificate[]{ mycert});
	    keyStore.store(new FileOutputStream("c:/ttt.keystore"), "123456".toCharArray());
	}

使用命令查看秘鑰庫

C:Usersjiaozi>keytool  -list -keystore c:/ttt.keystore -storepass 123456 -storetype JCEKS

密鑰庫類型: JCEKS
密鑰庫提供方: SunJCE

您的密鑰庫包含 3 個條目

myrsa, 2017-7-24, PrivateKeyEntry,
證書指紋 (SHA1): 82:C1:A5:10:4A:B1:6A:DC:88:01:88:FF:79:73:B7:B0:47:B6:F1:95
key1, 2017-7-24, SecretKeyEntry,
cert1, 2017-7-24, trustedCertEntry,
證書指紋 (SHA1): C0:E8:B5:ED:0F:CD:95:4B:13:C3:19:78:AE:65:F1:A7:1E:63:E8:B9

總結

以上是生活随笔為你收集整理的java常见证书类型和密钥库类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。