【问题标题】:How to access a url that requires a SafeNet eToken certificate using Java如何使用 Java 访问需要 SafeNet eToken 证书的 URL
【发布时间】:2014-05-07 18:15:20
【问题描述】:

下午好,

我已经有一个 SafeNet 5100 eToken,其中包含一个有效证书,我用它来访问我公司需要它的 Web 应用程序。

当我尝试使用网络浏览器(如 chrome)访问网络应用程序时,一切正常,我没有问题。一个来自 SafeNet 的对话框打开,我输入密码就可以访问该站点。

我现在要做的是通过 java 程序访问这个 Web 应用程序(我正在使用 IDE eclipse 对其进行编程)并且找不到如何做到这一点。是否有来自 SafeNet 的 API 或任何在线教程?

我在看这个帖子how to use Microsoft Crypto API with USB Dongle following PKCS#11,但不明白这个CryptoAPI CSP 是如何工作的。任何帮助表示赞赏。

谢谢

【问题讨论】:

    标签: java cryptoapi client-certificates e-token


    【解决方案1】:

    感谢这两个线程,我发现了如何做到这一点:

    How to get KeyStore from usb token in Java
    java keytool with opensc pkcs#11 provider only works with debug option enabled

    还有这个网站:

    Pdf Signing Using eToken in java

    首先,如果网站有一个默认 java 不信任的证书,您必须创建一个 trustStore 并将其加载到 java 的系统属性中。你可以在这里看到如何做到这一点:

    Oracle - Generating a KeyStore and TrustStore (using keytool)

    您必须找到用于您的智能卡/eToken 的 PKCS#11 库在您的计算机中的安装位置,在我的计算机中它位于“C:\Windows\System32\eTPKCS11.dll”中。然后像这样创建一个 .cfg 文件:

    name=SafeNet
    library=C:\Windows\System32\eTPKCS11.dll
    slot=4
    

    你在哪里给它一个名字和你的 PKCS#11 库的路径。 Slot 是连接您的 eToken/SmartCard 的插槽(如果您不想要,则无需设置)。

    现在我的代码如下所示:

    System.setProperty("javax.net.ssl.trustStore", "cfgFiles/trustedHttpsCertificates.truestore");
    System.setProperty("javax.net.ssl.trustStoreType", "jks");
    System.setProperty("javax.net.ssl.trustStorePassword", "oiadad");
    
    Provider newProvider = new SunPKCS11("cfgFiles/etpkcs11.cfg");
    Security.addProvider(newProvider);
    
    try {
        KeyStore keyStore = KeyStore.getInstance("PKCS11");
        keyStore.load(null, "".toCharArray());
    
        KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        keyFactory.init(keyStore,null);
    
        SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
        sslContext.init(keyFactory.getKeyManagers(), null, null);
        sslSocketFactory = sslContext.getSocketFactory();
    
    } catch (KeyStoreException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    } catch (CertificateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (NoSuchProviderException e) {
        e.printStackTrace();
    } catch (UnrecoverableKeyException e1) {
        e1.printStackTrace();
    } catch (KeyManagementException e1) {
        e1.printStackTrace();
    }
    

    我首先告诉 java 在哪里寻找我的 trustStore。然后我将路径传递给我的 cfg 文件,用它创建一个提供程序并告诉安全这个新提供程序存在。

    在此之后,我初始化并加载一个 PKCS11 KeyStore,给它一个空白密码(如果我愿意,可以传递我的真实密码,但这样会出现一个 SafeNet 弹出窗口并询问我的密码)。

    然后我实例化一个 KeyManagerFactory 和一个 SSLSocketFactory。这是使用 eToken 访问多重身份验证 https url 的最后一步。

    现在访问受保护的 https 网站还有一个技巧,您必须为 HttpsURLConnection 提供新的 SSLSocketFactory。你可以这样做:

    try {
        HttpsURLConnection conn = (HttpsURLConnection)new URL(<your-https-url-here>).openConnection();
        conn.setRequestMethod("GET");
        conn.setDoInput(true);
        conn.setSSLSocketFactory(sslSocketFactory);
    
        int responseCode = conn.getResponseCode();
        System.out.println("RESPONSE: " + responseCode);
    
        InputStream inputstream = conn.getInputStream();
        InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
        BufferedReader bufferedreader = new BufferedReader(inputstreamreader);
    
        String line = null;
        String htmlResponse = "";
    
        while ((line = bufferedreader.readLine()) != null) {
            htmlResponse += line + "\n";
            //System.out.println("html: " + line);
        }
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    我希望这可以帮助任何遇到电子令牌或智能卡问题的人。

    【讨论】:

      【解决方案2】:

      我不是 SafeNet 专家。您可以尝试使用 SAML 断言登录到 safeNet。 Java 有用于生成 SAML 断言的 OpenSAML API。

      【讨论】:

        猜你喜欢
        • 2011-12-28
        • 1970-01-01
        • 2018-01-21
        • 1970-01-01
        • 2015-06-30
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 2013-01-07
        相关资源
        最近更新 更多