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

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

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

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

+ View Code

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

 1     public static void main(String[] args) throws KeyStoreException, 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 = 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     }

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

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

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

二、听说最新版本的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 库来建立安全连接和非安全连接具体方式可以参考:

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

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

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

  1. python openssl 证书加解密过程感觉是这样

    python openssl 证书加解密过程感觉是这样 第一步 生成2048 bit的PEM格式的RSA Key:Key.pem openssl genrsa -out Key.pem -f4 204 ...

  2. JVM(Java SE 11版本)加载类和接口

    本文介绍了Java虚拟机(Java SE 11版本)加载类和接口. 加载类和接口 加载是指查找具有特定名称的类或接口类型的二进制形式的过程.典型的做法是,查找事先由Java编译器从源代码计算而来二进制 ...

  3. java证书加解密过程

    前提铺垫: 本机上构造两个数字证书用作测试,一个 Server 端 与一个Client 端 使用java keytool 生成自签名证书. 过程如下: 参数如下:  -genkeypair 生成密钥对 ...

  4. 基于Java的SQL Server数据库加解密系统设计与实现

    目 录 摘 要 1 ABSTRACT 2 第1章 绪论 3 1.1 数据库加解密系统开发背景 3 1.2 国内外现状 3 1.3 本文的主要工作 4 1.4 论文的组织结构 4 第2章 数据库加密的基 ...

  5. java C# objective-c AES对称加解密

    1 /** 2 * AES加解密 3 */ 4 public class AESHelper { 5 final static String AES_KEY = "43hr8fhu34b58 ...

  6. Java 实现 RSA 非对称加密算法-加解密和签名验签

    1. 非对称加密算法简介 非对称加密算法又称现代加密算法,是计算机通信安全的基石,保证了加密数据不会被破解.与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密(pr ...

  7. Java批量高效压缩支持加解密支持所有压缩格式(Zip/7z/rar)

    前言:有时候需要对很多文件进行压缩,几个还好如果有100个呢对吧,为什么不借助咱们强大的java呢,所以我就写了一个可以批量压缩,支持所有压缩格式的工具类当然也支持加密和解密,下面就是工具类的代码 废 ...

  8. 【Bcrypt+AES】 Vue+Java前后端分离信息加解密详解和问题解决

    文章目录 1.简单介绍Bcrypt[单向hash] 2.登录服务:使用Bcrypt加密和验证 2.1 Vue前端使用Bcrypt加密 2.2 SpringBoot后端使用Bcrypt验证密码 3.简单 ...

  9. encodingaeskey java,消息体签名与加解密-开发者QA

    Q 为什么要上线消息加密功能? A 为了更好的保护用户和公众账号的信息安全. Q 接入消息加解密功能复杂吗? A 开发者接入消息加解密功能并不复杂,微信团队提供了5种语言的示例代码(包括C++.php ...

最新文章

  1. css 联系我们,CSS3 模态窗口联系我们表单模板
  2. 从商业视角理解数据:数据科学家的思维之路
  3. hdu1874 畅通工程续
  4. java 代码执行el,专属于java的漏洞——EL表达式注入
  5. mysql 设置大小写_mysql修改大小写参数注意事项
  6. TStringList 的Sorted属性
  7. 进入顶层社会的顺序是什么?
  8. 支持Visual Studio 2008和.NET 3.5的企业类库4.0
  9. HTTPS客户端验证服务器端的过程
  10. Visual Studio 6/2005/2008/2010 各版本编译器 下载
  11. Arduino智能小车——小车测速
  12. 【转帖】龙芯3A3000处理器深度评测:和Intel、AMD差距巨大
  13. P68是什么意思 IP67和IP68等级有什么区别
  14. PM如何写好产品需求文档
  15. 玩转 IDEA 系列教程——强烈推荐官方中文(汉化)插件!
  16. ChatGPT真的会取代程序员吗?
  17. SAP英语专栏:第1篇
  18. Unreal Engin_画廊制作笔记 _008灯光处理,夜晚的画廊灯光设置
  19. SEO高质量的伪原创怎么写?
  20. 网络主机防泄密安全保护方案

热门文章

  1. 哲学家就餐与死锁问题,死锁产生的条件以及解决方案
  2. 一天搞定HTML----常用标签01
  3. emwin修改text字体颜色_Rggplot2 绘制带颜色条的相关性散点图
  4. 通俗易懂:贪心算法(一):分配问题 (力扣455分发饼干 和135分发糖果)
  5. Python学习--环境搭建
  6. webpack从入门到精通(三)生产环境的基本配置
  7. MyEclipse创建JavaWeb应用和TomCat的配置
  8. android音频开发6,Android 音视频开发(一) : 通过三种方式绘制图片
  9. php获取excel表格内容,利用PHPExcel如何读取表格中内容
  10. 开源 Serverless 里程碑:Knative 1.0 来了