我有一个基本上是WS客户端的独立应用程序。它连接到一个安全的WS,它使用证书进行身份验证,部署在JBoss AS7上。当我从IDE启动应用程序时,一切正常(密钥库和信任库都已加载),但当我尝试作为 webstart 应用程序时遇到麻烦。
问题是,从webstart启动时,密钥库未加载。另一方面,信任库完全加载。 Webstart控制台输出:
trustStore is: /home/matijav/certs/matija.truststore
trustStore type is : JKS
trustStore provider is :
init truststore
adding as trusted cert:
Subject: CN=matija, OU=Dev, O=SL, L=Lj, ST=Slo, C=SI
Issuer: CN=matija, OU=Dev, O=SL, L=Lj, ST=Slo, C=SI
Algorithm: RSA; Serial number: 0x52b45d57
Valid from Fri Dec 20 16:08:07 CET 2013 until Thu Mar 20 16:08:07 CET 2014
因此,当我的应用尝试连接到WS时,我得到com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate.
这是我的配置:
在JNLP中,我定义了所有权限。
<security>
<all-permissions/>
</security>
所有广告均使用相同,自行生成证书进行签名。
第一次(如果用户想要更改它),应用程序会在JDialog中向用户询问密钥库/传递和信任库/传递组合。随着
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(new FileInputStream(keyStorePath), passwordField.getPassword());
我检查密钥库/信任库并传递匹配项。如果组合匹配,则将所有内容设置为系统属性:
System.setProperty("javax.net.ssl.keyStore", keyStorePath);
System.setProperty("javax.net.ssl.trustStore", trustStorePath);
System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass);
System.setProperty("javax.net.ssl.trustStorePassword", trustStorePass);
System.setProperty("javax.net.ssl.keyStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
然后调用WS:
port = new MyService(url).getMyPort();
final Map<String,Object> requestContext = ((BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, connection.getEndpoint());
//and here, when the app tries to authenticate to JBoss WS mechanism, I get bad_certificate exception.
port.callMethod(params);
据我所知,问题是没有加载密钥库,所以显然WS调用失败了。任何人都可以向我解释为什么没有加载密钥库以及我缺少什么?
谢谢你, Matija