java pkcs#11读取证书加解密(初学-分享)
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)題。
- 上一篇: JDK5.0环境下配置PKCS#11
- 下一篇: sunPKCS11加载动态库(转)