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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java常见证书类型和密钥库类型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一 。證書類型

? ?1》證書概念:

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

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

? ? ? 證書的過期時間 證書的頒發(fā)機(jī)構(gòu) 證書頒發(fā)機(jī)構(gòu)對證書的簽名,簽名算法,對象的公鑰等

? ? ??數(shù)字證書的格式遵循X.509標(biāo)準(zhǔn)。X.509是由國際電信聯(lián)盟(ITU-T)制定的數(shù)字證書標(biāo)準(zhǔn)。

? ?2》證書類型(表格采集自網(wǎng)絡(luò))

?

格式

擴(kuò)展名

描述

特點

DER

.cer/.crt/.rsa

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

不含私鑰、二進(jìn)制

PKCS7

.p7b/.p7r

【PKCS #7】加密信息語法標(biāo)準(zhǔn)

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

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】的簡寫,但他也同樣廣泛運(yùn)用于密鑰管理
2、ASCII文件
3、一般基于base 64編碼

PKCS10

.p10/.csr

【PKCS #10】公鑰加密標(biāo)準(zhǔn)【Certificate Signing Request】

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

SPC

.pvk/.spc

【Software Publishing Certificate】

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

?

?

二。密鑰庫類型

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

? ?一般是MD5WithRSA或者 SHA1WithRSA?(表格采集自網(wǎng)絡(luò))

?

格式

擴(kuò)展名

描述

特點

JKS

.jks/.ks

【Java Keystore】密鑰庫的Java實現(xiàn)版本,provider為SUN

密鑰庫和私鑰用不同的密碼進(jìn)行保護(hù)

JCEKS

.jce

【JCE Keystore】密鑰庫的JCE實現(xiàn)版本,provider為SUN JCE

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

時采用TripleDES

PKCS12

.p12/.pfx

【PKCS #12】個人信息交換語法標(biāo)準(zhǔn)

1、包含私鑰、公鑰及其證書
2、密鑰庫和私鑰用相同密碼進(jìn)行保護(hù)

BKS

.bks

【Bouncycastle Keystore】密鑰庫的BC實現(xiàn)版本,provider為BC

基于JCE實現(xiàn)

UBER

.ubr

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

?

?

三。使用java的keytool生成證書

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

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

?

  • 秘鑰庫可以單獨(dú)存儲證書條目(trustedCertEntry) 表示信任的證書,

  • 秘鑰庫可以存儲生成的證書和私鑰(PrivateKeyEntry)

  • ?

    ?keytool /?查看所有的子命令

    ?

  • C:\Users\jiaozi>keytool

  • 密鑰和證書管理工具

  • ?
  • 命令:

  • ?
  • -certreq 生成證書請求

  • -changealias 更改條目的別名

  • -delete 刪除條目

  • -exportcert 導(dǎo)出證書

  • -genkeypair 生成密鑰對

  • -genseckey 生成密鑰

  • -gencert 根據(jù)證書請求生成證書

  • -importcert 導(dǎo)入證書或證書鏈

  • -importkeystore 從其他密鑰庫導(dǎo)入一個或所有條目

  • -keypasswd 更改條目的密鑰口令

  • -list 列出密鑰庫中的條目

  • -printcert 打印證書內(nèi)容

  • -printcertreq 打印證書請求的內(nèi)容

  • -printcrl 打印 CRL 文件的內(nèi)容

  • -storepasswd 更改密鑰庫的存儲口令

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

    ?

    ?

  • C:\Users\jiaozi>keytool -genkeypair /?

  • 非法選項: \a

  • keytool -genkeypair [OPTION]...

  • 生成密鑰對

  • 選項:

  • -alias <alias> 要處理的條目的別名

  • -keyalg <keyalg> 密鑰算法名稱

  • -keysize <keysize> 密鑰位大小

  • -sigalg <sigalg> 簽名算法名稱

  • -destalias <destalias> 目標(biāo)別名

  • -dname <dname> 唯一判別名

  • -startdate <startdate> 證書有效期開始日期/時間

  • -ext <value> X.509 擴(kuò)展

  • -validity <valDays> 有效天數(shù)

  • -keypass <arg> 密鑰口令

  • -keystore <keystore> 密鑰庫名稱

  • -storepass <arg> 密鑰庫口令

  • -storetype <storetype> 密鑰庫類型

  • -providername <providername> 提供方名稱

  • -providerclass <providerclass> 提供方類名

  • -providerarg <arg> 提供方參數(shù)

  • -providerpath <pathlist> 提供方類路徑

  • -v 詳細(xì)輸出

  • -protected 通過受保護(hù)的機(jī)制的口令

  • 常用的命令

    》》keytool -genkeypair -alias 被存儲在秘鑰庫的證書名稱 ?-keystore 證書的位置(默認(rèn)當(dāng)前工作目錄下 文件名 .keystore) ?-storepass 密鑰庫的口令

    -validity 有效期的天數(shù) -keypass 秘鑰口令

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

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

    ? 再增加一個證書

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

    》》查看密鑰庫的證書列表(密續(xù)輸入秘鑰庫的密碼才能查看) java默認(rèn)的密鑰庫為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

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

    ?

  • C:\Users\jiaozi>keytool -exportcert -alias test -file c:/a.cer -keystore c:/a.k

  • eystore -storepass 123456

  • 存儲在文件 <c:/a.cer> 中的證書

  • 》》添加證書到秘鑰庫中

    ?

  • C:\Users\jiaozi>keytool -importcert -alias test2 -file c:/a.cer -keystore c:/a.

  • keystore -storepass 123456

  • 在別名 <test> 之下, 證書已經(jīng)存在于密鑰庫中

  • 是否仍要添加? [否]: y

  • 證書已添加到密鑰庫中

  • ?
  • C:\Users\jiaozi>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

  • 》》數(shù)據(jù)證書簽發(fā)申請 csr

    ?首先 假設(shè)生成一個根證書 ?默認(rèn)是自己頒發(fā)給自己也就是自簽名證書

    ?

  • C:\Users\jiaozi>keytool -genkeypair -keystore c:/root.keystopre

  • 輸入密鑰庫口令:

  • 再次輸入新口令:

  • 您的名字與姓氏是什么?

  • [Unknown]: jiaozi

  • 您的組織單位名稱是什么?

  • [Unknown]: yt

  • 您的組織名稱是什么?

  • [Unknown]: ytgroup

  • 您所在的城市或區(qū)域名稱是什么?

  • [Unknown]: zh_CN

  • 您所在的省/市/自治區(qū)名稱是什么?

  • [Unknown]: gd

  • 該單位的雙字母國家/地區(qū)代碼是什么?

  • [Unknown]: china

  • CN=jiaozi, OU=yt, O=ytgroup, L=zh_CN, ST=gd, C=china是否正確?

  • [否]: y

  • ?
  • 輸入 <mykey> 的密鑰口令

  • (如果和密鑰庫口令相同, 按回車):

  • ?
  • C:\Users\jiaozi>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

  • 使用該證書簽發(fā)其他的證書

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

    ? ? ?keytool -genkeypair -keystore c:/my.keystopre

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

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

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

    ? ?keytool -gencert -alias mykey -keystore c:\root.keystore -infile c:\my.csr -outfil
    e c:\my.cer

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

    ? ??

    證書路徑確沒有顯示正確的結(jié)構(gòu) 應(yīng)該是jiaozi下的子節(jié)點是p2p 這里是因為根節(jié)點沒有被系統(tǒng)信任

    需要將根證書導(dǎo)入到系統(tǒng)受信任的頒發(fā)機(jī)構(gòu)中 ?以后所有根證書簽發(fā)的證書都是被信任的?

    導(dǎo)出root.keystore中的根證書?

    ?keytool -exportcert -keystore root.keystore -file c:\rootca.cer

    設(shè)置如下:

    打開chrome瀏覽器 ?選擇 選項或者設(shè)置 ?點擊高級 ? 管理證書選項 ?點開 收信任的根證書頒發(fā)機(jī)構(gòu) ?點擊左下角導(dǎo)入 下一步 選擇 被簽名的

    導(dǎo)入成功后可以看到

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

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

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

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

    ?

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

  • /**

  • *java默認(rèn)密鑰庫為jks 支持PKCS12,JCEKS等

  • *JCEKS支持 秘鑰 支持信任證書和私鑰

  • *JKS和PKCS支持信任證書和私鑰 不支持單獨(dú)秘鑰

  • * @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();

  • //單獨(dú)只是存儲一個秘鑰 如果是JKS和PKCS 會拋出錯誤 不支持單獨(dú)秘鑰

  • 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:\Users\jiaozi>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

  • ?

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。