首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PKCS#11 PKCS11 dll

PKCS#11 PKCS11 dll
EN

Stack Overflow用户
提问于 2012-01-16 22:40:52
回答 2查看 8.9K关注 0票数 0

我们在这里尝试实现一个java独立应用程序,它可以连接到https网站并使用PKI智能卡进行身份验证,我们正在运行各种问题。

我不得不提到,如果我们使用applet (然后浏览器的keystore和trustore将被使用),我们就能够运行这种应用程序,一切都运行得很好,我们输入卡的密码,我们就可以访问网页了。

我有两个问题。首先关于我的代码,有没有人发现它有什么问题。我包含了我们在运行它时遇到的运行时错误:

代码语言:javascript
复制
public class TestPKCS11 {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    // Set keyStore and trustStore
    System.setProperty("javax.net.ssl.trustStoreType", "PKCS11");
    System.setProperty("javax.net.ssl.trustStore", "NONE");
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    System.setProperty("javax.net.ssl.trustStoreProvider", "SunPKCS11-mycard");
    String trustStore = System.getProperty("javax.net.ssl.trustStore");
    if (trustStore == null) {
        System.out.println("javax.net.ssl.trustStore is not defined");
    } else {
        System.out.println("javax.net.ssl.trustStore = " + trustStore);
    }

    System.setProperty("javax.net.ssl.keyStoreType", "PKCS11");
    System.setProperty("javax.net.ssl.keyStore", "NONE");
    System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
    System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-mycard");
    String keyStore = System.getProperty("javax.net.ssl.keyStore");
    if (keyStore == null) {
        System.out.println("javax.net.ssl.keyStore is not defined");
    } else {
        System.out.println("javax.net.ssl.keyStore = " + keyStore);
    }

    System.setProperty("javax.net.debug", "ssl"); // dynamic conf of PKCS#11

    String configName = "C:\\confDirectory\\pkcs11.cfg";

    sun.security.pkcs11.SunPKCS11 sunPKCS11 = new sun.security.pkcs11.SunPKCS11(configName);
    Provider p = sunPKCS11;
    Security.addProvider(p);


    SSLSocketFactory sslFact = (SSLSocketFactory) SSLSocketFactory.getDefault();

    try{
        SSLSocket sock = (SSLSocket)sslFact.createSocket("myserver", 8081);

        sock.startHandshake();

    } catch (SSLHandshakeException ex) {
        Logger.getLogger(TestPKCS11.class.getName()).log(Level.SEVERE, null, ex);
        System.out.println(ex.getMessage());
    } 
    catch (IOException ex) {
        Logger.getLogger(TestPKCS11.class.getName()).log(Level.SEVERE, null, ex);
    }
}

执行错误:

代码语言:javascript
复制
Exception in thread "main" java.security.ProviderException: Initialization failed
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:340)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:86)
    at TestPKCS11.main(TestPKCS11.java:95)
Caused by: java.io.IOException: The specified procedure could not be found.
    at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method)
    at sun.security.pkcs11.wrapper.PKCS11.<init>(PKCS11.java:141)
    at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:154)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:281)
    ... 2 more

我的第二个问题是关于用于pkcs11的dll。目前,我正在使用IBM的Rational安装包(jpkcs11.dll)中包含的,但我真的不确定它是否是好的。我读过有关OpenSC的文章,但找不到OpenSC-pkcs11.dll文件。我只能见opensc.dll了。

我在使用Java1.627的Windows7上运行

谢谢

EN

回答 2

Stack Overflow用户

发布于 2012-01-17 15:51:24

将OpenSC PKCS#11命名为"opensc-pkcs11.dll“,并将其放入system32。但您需要确保您的智能卡受OpenSC支持。作为一般规则:您需要使用卡附带的PKCS#11提供者(通常是闭源的)或支持您的卡的提供者(如OpenSC)

票数 2
EN

Stack Overflow用户

发布于 2012-07-14 14:15:57

您可以从用户主目录动态加载DLL,而不是将DLL放到system32中。但这取决于您的应用程序,您将如何安装它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8881536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档