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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

java pkcs#11读取证书加解密(初学-分享)

發(fā)布時(shí)間:2025/3/20 编程问答 61 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java pkcs#11读取证书加解密(初学-分享) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

java pkcs#11讀取證書(shū)加解密(初學(xué)-分享)

http://www.cnblogs.com/sunfb/archive/2013/02/28/2937227.html

插入U(xiǎn)SB-KEY, 想通過(guò)HttpClient來(lái)向服務(wù)器發(fā)送https請(qǐng)求。

?

一、httpClient只能夠支持java證書(shū)文件,他提供的例子如下

+ View Code

  如果USB-KEY的驅(qū)動(dòng)程序支持PKCS#11接口,則OpenSSL通過(guò)engine可以比較方便地訪問(wèn)USB-KEY。

1 public static void main(String[] args) throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException { 2 // 程序并為將私鑰提取出來(lái),只是調(diào)用了私鑰的接口 3 String pkcs11config="name=PKCS11/n" + 4 "library=C://WINDOWS//system32//GP_IFD.dll"; 5 byte[] pkcs11configbytes=pkcs11config.getBytes(); 6 ByteArrayInputStream configStream = new ByteArrayInputStream(pkcs11configbytes); 7 8 Provider p = new sun.security.pkcs11.SunPKCS11(configStream); 9 Security.addProvider(p); 10 char[] pin = "password".toCharArray(); 11 KeyStore ks = KeyStore.getInstance("PKCS11"); 12 ks.load(null, pin); 13 System.out.println( ks ); 14 15 KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 16 17 Enumeration enumeration = keyStore.aliases(); 18 while (enumeration.hasMoreElements()) { 19 String alias = (String) enumeration.nextElement(); 20 System.out.println("----alias---:"+alias); 21 X509Certificate certificate = (X509Certificate)keyStore.getCertificate(alias); 22 System.out.println("----certificate---:"+certificate); 23 PrivateKey privateKey = (PrivateKey) keyStore.getKey(alias, null); 24 System.out.println("----privateKey---:"+privateKey); 25 } 26 27 }

不曉得哪些廠商實(shí)現(xiàn)了這個(gè)接口,既然涉及到安全大家都沒(méi)有那么友好了。我用下面這段代碼來(lái)訪問(wèn)農(nóng)行的KEY寶(廠商是華大),報(bào)錯(cuò):

Exception in thread "main" java.security.ProviderException: Initialization failed at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:186) at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:80) at cn.com.hd.test.pkcs11.main(pkcs11.java:65) Caused by: java.io.IOException: ???????¨????ò??

at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method) at sun.security.pkcs11.wrapper.PKCS11.<init>(PKCS11.java:125) at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:138) at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:128) ... 2 more

?

應(yīng)該根本就不支持這個(gè)接口吧

?

二、聽(tīng)說(shuō)最新版本的OpenSSL 0.9.8i版本已經(jīng)增WINDOWS CAPI的支持。有人進(jìn)行測(cè)試:

進(jìn)行對(duì)USB-KEY的試驗(yàn)(特別說(shuō)明,試驗(yàn)用的USB-KEY是公安專(zhuān)用,所以第一次訪問(wèn)USB-KEY時(shí)會(huì)要求輸入KEY的密碼,并在公安內(nèi)網(wǎng)中進(jìn)行試驗(yàn)。)

1、用新編譯的軟件發(fā)起HTTPS頁(yè)面請(qǐng)求,軟件彈出公安KEY的密碼輸入窗口。(可以證明去訪問(wèn)了CAPI,并成功訪問(wèn)到該USB)。

2、輸入密碼后,返回的頁(yè)面中帶有USB-KEY主人的信息。(被證明USB-KEY支持成功)

3、撥出USB-KEY,再次請(qǐng)求該頁(yè)面。返回的頁(yè)面中不帶任何人員信息,直接跳轉(zhuǎn)到登錄窗口。

4、再次插入(測(cè)試軟件不重啟),再次請(qǐng)求HTTPS,又出現(xiàn)密碼輸入窗口,輸入密碼后,成功訪問(wèn)頁(yè)面,頁(yè)面中并帶有USB-KEY主人的信息。

5、再次請(qǐng)求該頁(yè)面,沒(méi)有出現(xiàn)密碼輸入窗口,頁(yè)面返回正常,即同樣帶有USB-KEY主人的信息。

通過(guò)以上五步測(cè)試,證明新編譯的OPENSSL0.9.8i版本可以自動(dòng)的向CAPI進(jìn)行調(diào)用。這給需要在OPENSSL中支持CAPI接口的開(kāi)發(fā)者來(lái)說(shuō)是一種福音,至少對(duì)我來(lái)說(shuō)是,不用自己寫(xiě)代碼,還要測(cè)試等等,呵呵。

這個(gè)版本好像只支持WINDOWS下的CAPI接口,LINUX下的不清楚了。就說(shuō)到這里,本著OPENSSL開(kāi)源的原則,我把我的測(cè)試經(jīng)過(guò)供大家參考。以后如果有類(lèi)似需求的朋友可以嘗試一下。

?

通過(guò)調(diào)用OpenSSL 的BIO 庫(kù)來(lái)建立安全連接和非安全連接具體方式可以參考:

http://www.ibm.com/developerworks/cn/linux/l-openssl.html

?

不過(guò)這些都是C的方式,本來(lái)想用httpClient提交請(qǐng)求的,難道就沒(méi)有好java的方法了嗎?

總結(jié)

以上是生活随笔為你收集整理的java pkcs#11读取证书加解密(初学-分享)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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