我使用本指南为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选项之前我出错了吗?
答案 0 :(得分:1)
从预期消息“验证自签名证书失败”,我得出结论服务器不信任签署/加密soap消息的客户端证书。
您应该检查glassfish使用的信任库以及它是否包含客户端证书。我对玻璃鱼知之甚少,但here似乎是一些方向。 servicestore.jks是否用作信任库,并且确实包含一些客户端证书。可以轻松地重新生成clientstore.jks并忘记重新创建信任库。
如果信任库包含预期的证书并且实际上由glassfish使用,您还应该检查客户端发送的证书。查看标题并查看BinarySecurityToken。根据您选择的WSIT,它包含消息中使用的证书。