如何使用Java访问需要SafeNet eToken证书的URL

时间:2014-05-07 18:15:21

标签: java cryptoapi client-certificates e-token

下午好,

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

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

我现在要做的是通过java程序访问这个Web应用程序(我使用IDE eclipse进行编程),但无法找到如何执行此操作。 SafeNet是否有任何API可以执行此操作或任何在线教程?

我正在查看此帖子how to use Microsoft Crypto API with USB Dongle following PKCS#11,但无法理解这个CryptoAPI CSP是如何工作的。任何帮助表示赞赏。

谢谢

2 个答案:

答案 0 :(得分: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)

您必须找到计算机中安装了用于smartCard / 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网址的最后一步。

现在只有一个技巧可以访问受保护的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();
}

我希望这有助于任何人在使用e​​Tokens或智能卡时遇到问题。

答案 1 :(得分:0)

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