在Web服务上使用带有自签名证书的WSIT安全性(Glassfish)

时间:2011-10-20 11:19:19

标签: java web-services security glassfish wsit

我使用本指南为Metro创建证书:http://www.jroller.com/gmazza/entry/using_openssl_to_create_certificates

所以我现在有了servicestore.jks和clientstore.jks。

当我检查密钥库时,我发现servicestore.jks中的PrivateKeyEntry是myservicekey,trustedCertEntry是myclientkey。在clientstore.jks中反之亦然。

我在客户端xml和service wsit xml中使用它们。我按照官方的WSIT教程在Netbeans中执行此操作。一切都很好。

因此,当从客户端测试方法调用时,我得到以下异常:

  

[#| 2011-10-19T08:59:38.465 + 0200 | INFO | glassfish3.1.1 | com.sun.metro.policy | _ThreadID = 81; _ThreadName = HTTP线程池8080(1); | WSP5018:   从文件加载WSIT配置:   文件:/opt/glassfish3/glassfish/domains/domain1/applications/testwebapp/WEB-INF/classes/META-INF/wsit-client.xml |#]

     

[#| 2011-10-19T08:59:41.167 + 0200 |严重| glassfish3.1.1 | javax.enterprise.resource.xml.webservices.security | _ThreadID = 84; _ThreadName = HTTP线程池-8080( 4); | WSS1533:   验证自签名证书失败。|#]

     

[#| 2011-10-19T08:59:41.171 + 0200 |严重| glassfish3.1.1 | com.sun.xml.wss.provider.wsit | _ThreadID = 84; _ThreadName = HTTP线程池-8080( 4); | WSITPVD0035:   验证入站邮件中的安全性时出错。   com.sun.xml.wss.XWSSecurityException:验证自签名   证书失败           at com.sun.xml.wss.impl.misc.WSITProviderSecurityEnvironment.validateCertificate(WSITProviderSecurityEnvironment.java:937)           at com.sun.xml.ws.security.opt.impl.incoming.X509BinarySecurityToken.validate(X509BinarySecurityToken.java:185)           at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.handleSecurityHeader(SecurityRecipient.java:396)           at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.cacheHeaders(SecurityRecipient.java:275)           at com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.validateMessage(SecurityRecipient.java:225)           at com.sun.xml.wss.provider.wsit.WSITServerAuthContext.verifyInboundMessage(WSITServerAuthContext.java:586)   .............

当我尝试在客户端xml中使用错误密码时,我得到了一个不同的异常,当我使用错误的文件名时,我得到了一个未找到文件的异常。所以它至少找到了clientstore。

所以我认为服务密钥库可能有问题(我认为它可能使用默认的glassfish而不是我自己的)并在domain.xml中找到了一些选项。所以我改变了这些:

  

-Dcom.sun.enterprise.security.httpsOutboundKeyAlias = myservicekey   -Djavax.net.ssl.keyStore = $ {} com.sun.aas.instanceRoot /config/servicestore.jks   -Djavax.net.ssl.keyStorePassword = sspas   -Djavax.net.ssl.trustStore = $ {} com.sun.aas.instanceRoot /config/servicestore.jks   -Djavax.net.ssl.trustStorePassword = sspass   -DSERVER_KEY_ALIAS = myservicekey   -DCLIENT_KEY_ALIAS = myclientkey

但是当我重新启动服务器时,我收到此异常,无法访问管理控制台的登录信息:

  

.............引起:java.io.IOException:Keystore被篡改   用,或密码不正确           at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772)           at sun.security.provider.JavaKeyStore $ JKS.engineLoad(JavaKeyStore.java:55)           在java.security.KeyStore.load(KeyStore.java:1214)           在com.sun.enterprise.security.ssl.impl.SecuritySupportImpl.loadKS(SecuritySupportImpl.java:254)           在com.sun.enterprise.security.ssl.impl.SecuritySupportImpl.loadStores(SecuritySupportImpl.java:208)           ... 63更多引起:java.security.UnrecoverableKeyException:密码验证失败           at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770)           ... 67更多

然后我在WSIT教程中阅读以下内容:为了在Glassfish上使用WSIT安全性,您必须将受信任的存储导入GlassFish的密钥库,并从NetBeans IDE中指定这些证书。

所以我不能使用自己的密钥库?更改domain.xml时是否遗漏了任何内容?或者在整个jvm选项之前我出错了吗?

1 个答案:

答案 0 :(得分:1)

从预期消息“验证自签名证书失败”,我得出结论服务器不信任签署/加密soap消息的客户端证书。

您应该检查glassfish使用的信任库以及它是否包含客户端证书。我对玻璃鱼知之甚少,但here似乎是一些方向。 servicestore.jks是否用作信任库,并且确实包含一些客户端证书。可以轻松地重新生成clientstore.jks并忘记重新创建信任库。

如果信任库包含预期的证书并且实际上由glassfish使用,您还应该检查客户端发送的证书。查看标题并查看BinarySecurityToken。根据您选择的WSIT,它包含消息中使用的证书。