博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java pkcs 11 write_java pkcs#11读取证书加解密(初学-分享)
阅读量:4678 次
发布时间:2019-06-09

本文共 3075 字,大约阅读时间需要 10 分钟。

插入USB-KEY, 想通过HttpClient来向服务器发送https请求。

一、httpClient只能够支持java证书文件,他提供的例子如下

DefaultHttpClient httpclient = new DefaultHttpClient();

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

FileInputStream instream = new FileInputStream(new File("my.keystore"));

try {

trustStore.load(instream, "nopassword".toCharArray());

} finally {

instream.close();

}

SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);

Scheme sch = new Scheme("https", socketFactory,443);

httpclient.getConnectionManager().getSchemeRegistry().register(sch);

如果USB-KEY的驱动程序支持PKCS#11接口,则OpenSSL通过engine可以比较方便地访问USB-KEY。

1 public static void main(String[] args) throwsKeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException {2 //程序并为将私钥提取出来,只是调用了私钥的接口

3 String pkcs11config="name=PKCS11/n" +

4 "library=C://WINDOWS//system32//GP_IFD.dll";5 byte[] pkcs11configbytes=pkcs11config.getBytes();6 ByteArrayInputStream configStream = newByteArrayInputStream(pkcs11configbytes);7

8 Provider p = newsun.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 }

不晓得哪些厂商实现了这个接口,既然涉及到安全大家都没有那么友好了。我用下面这段代码来访问农行的KEY宝(厂商是华大),报错:

Exception in thread "main" java.security.ProviderException: Initialization failed at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:186) at sun.security.pkcs11.SunPKCS11.(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.(PKCS11.java:125) at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:138) at sun.security.pkcs11.SunPKCS11.(SunPKCS11.java:128) ... 2 more

应该根本就不支持这个接口吧

二、听说最新版本的OpenSSL 0.9.8i版本已经增WINDOWS CAPI的支持。有人进行测试:

进行对USB-KEY的试验(特别说明,试验用的USB-KEY是公安专用,所以第一次访问USB-KEY时会要求输入KEY的密码,并在公安内网中进行试验。)

1、用新编译的软件发起HTTPS页面请求,软件弹出公安KEY的密码输入窗口。(可以证明去访问了CAPI,并成功访问到该USB)。

2、输入密码后,返回的页面中带有USB-KEY主人的信息。(被证明USB-KEY支持成功)

3、拨出USB-KEY,再次请求该页面。返回的页面中不带任何人员信息,直接跳转到登录窗口。

4、再次插入(测试软件不重启),再次请求HTTPS,又出现密码输入窗口,输入密码后,成功访问页面,页面中并带有USB-KEY主人的信息。

5、再次请求该页面,没有出现密码输入窗口,页面返回正常,即同样带有USB-KEY主人的信息。

通过以上五步测试,证明新编译的OPENSSL0.9.8i版本可以自动的向CAPI进行调用。这给需要在OPENSSL中支持CAPI接口的开发者来说是一种福音,至少对我来说是,不用自己写代码,还要测试等等,呵呵。

这个版本好像只支持WINDOWS下的CAPI接口,LINUX下的不清楚了。就说到这里,本着OPENSSL开源的原则,我把我的测试经过供大家参考。以后如果有类似需求的朋友可以尝试一下。

通过调用OpenSSL 的BIO 库来建立安全连接和非安全连接具体方式可以参考:

不过这些都是C的方式,本来想用httpClient提交请求的,难道就没有好java的方法了吗?

转载地址:http://lxfkp.baihongyu.com/

你可能感兴趣的文章
数据挖掘学习--数据仓库
查看>>
基于Eclipse的Hadoop应用开发环境配置
查看>>
howto:Vaadin开发环境部署 for Spring Roo - vaadin.com
查看>>
mariadb semi plugin遇到的坑
查看>>
使用Collectd + InfluxDB + Grafana进行JMX监控
查看>>
Linux下tar,zip命令详解
查看>>
NABCD分析
查看>>
input实时监听
查看>>
Maven学习:常用mvn命令
查看>>
C#垃圾回收机制
查看>>
web项目部署到Tomcat服务器的三种方式
查看>>
P1962 斐波那契数列-题解(矩阵乘法扩展)
查看>>
Kibana6.x.x源码分析--Error: $injector:nomod Module Unavailable
查看>>
周围区域问题
查看>>
31、任务三十一——表单联动
查看>>
[ios] IOS文件操作的两种方式:NSFileManager操作和流操作【转】
查看>>
Jenkins之Linux和window配置区别
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>
Java之字符流操作-复制文件
查看>>