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


    插入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) 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的方法了吗?

  • 相关阅读:
    Filebeat 日志收集器 安装和配置
    纠错式教学法对比鼓励式教学法 -----Lily、贝乐、英孚,乐加乐、剑桥国际、优学汇、北外青少
    硅谷夜谈
    指路Reactive Programming
    Spring WebFlux 要革了谁的命?
    flink部署操作-flink standalone集群安装部署
    Flink的高可用集群环境
    当怪物来敲门 经典台词
    浅析几种线程安全模型
    最详细的排序解析,理解七大排序
  • 原文地址:https://www.cnblogs.com/sunfb/p/2937227.html
Copyright © 2020-2023  润新知