2

我使用本指南为 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 和服务 wsit xml 中使用这些。我按照官方 WSIT 教程在 Netbeans 中执行此操作。一切都部署得很好。

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

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

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

[#|2011-10-19T08:59:41.171+0200|SEVERE|glassfish3.1.1|com.sun.xml.wss.provider.wsit|_ThreadID=84;_ThreadName=http-thread-pool-8080(4); |WSITPVD0035: 验证入站消息中的安全性时出错。com.sun.xml.wss.XWSSecurityException:自签名证书的验证在 com.sun.xml.wss.impl.misc.WSITProviderSecurityEnvironment.validateCertificate(WSITProviderSecurityEnvironment.java:937) 在 com.sun.xml.ws.security 失败。 opt.impl.incoming.X509BinarySecurityToken.validate(X509BinarySecurityToken.java:185) 在 com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.handleSecurityHeader(SecurityRecipient.java:396) 在 com.sun.xml。 ws.security.opt.impl.incoming.SecurityRecipient.cacheHeaders(SecurityRecipient.java:275) 在 com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient。

当我尝试在客户端 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 was tampered, or password is wrong at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772) at sun .security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55) at java.security.KeyStore.load(KeyStore.java:1214) at com.sun.enterprise.security.ssl.impl.SecuritySupportImpl.loadKS(SecuritySupportImpl .java:254) at com.sun.enterprise.security.ssl.impl.SecuritySupportImpl.loadStores(SecuritySupportImpl.java:208) ... 63 更多原因:java.security.UnrecoverableKeyException:sun.security 的密码验证失败。 provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770) ... 67 更多

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

所以我不能使用自己的密钥库?更改 domain.xml 时我错过了什么吗?还是在整个 jvm 选项之前我出错了?

4

1 回答 1

1

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

您应该检查 glassfish 使用哪个信任库以及它是否包含客户端证书。我对glassfish不太了解,但这里似乎有一些方向。servicestore.jks 是否用作信任库,并且确实包含确切的某些客户端证书。人们可以轻松地重新生成 clientstore.jks 而忘记重新创建信任库。

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

于 2011-10-20T13:20:14.607 回答