首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Java访问需要SafeNet eToken证书的url

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

Stack Overflow用户
提问于 2014-05-07 18:15:20
回答 2查看 4.1K关注 0票数 1

下午好,

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

当我尝试使用web浏览器(如chrome)访问web应用程序时,一切都很好,我没有问题。一个来自SafeNet的对话框打开,我输入了我的密码,我可以访问这个网站。

我现在要做的是通过一个java程序访问这个web应用程序(我正在用IDE eclipse编程),却找不到如何做到这一点。有来自SafeNet的API来做这个或任何在线教程吗?

我在看这个线程如何在PKCS#11下使用和USB,但不明白这个CryptoAPI CSP是如何工作的。任何帮助都是非常感谢的。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-15 21:26:37

通过这两个线程,我了解了如何做到这一点:

如何在Java中从usb中获取KeyStore

带有opensc pkcs#11提供程序的java只在启用调试选项时工作。

这个网站:

在java中使用eToken进行Pdf签名

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

Oracle -生成KeyStore和TrustStore (使用keytool)

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

代码语言:javascript
复制
name=SafeNet
library=C:\Windows\System32\eTPKCS11.dll
slot=4

在这里,您给它一个名称和您的PKCS#11库的路径。插槽是连接电子托肯/智能卡的插槽(如果不需要的话,不需要设置这个插槽)。

现在我的代码如下所示:

代码语言:javascript
复制
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 urls的最后一步。

现在,要访问受保护的https网站,还有一个窍门,您必须给HttpsURLConnection新的SSLSocketFactory。你可以这样做:

代码语言:javascript
复制
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();
}

我希望这能帮助那些对eTokens或SmartCards有问题的人。

票数 2
EN

Stack Overflow用户

发布于 2014-05-07 18:22:44

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

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

https://stackoverflow.com/questions/23525241

复制
相关文章

相似问题

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