下午好,
我有一个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是如何工作的。任何帮助表示赞赏。
谢谢
答案 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();
}
我希望这有助于任何人在使用eTokens或智能卡时遇到问题。
答案 1 :(得分:0)
我不是SafeNet专家。您可以尝试使用SAML断言登录safeNet。 Java有OpenSAML API用于生成SAML断言。