【问题标题】:Using WSIT security on web service with self signed certificates (Glassfish)在具有自签名证书的 Web 服务上使用 WSIT 安全性 (Glassfish)
【发布时间】:2011-10-20 11:19:18
【问题描述】:

我使用本指南为 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 配置: 文件:/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.validateMessage(SecurityRecipient.java:225) 在 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 was tampered 有,或密码不正确 在 sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:772) 在 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:密码验证失败 在 sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:770) ... 67 更多

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

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

【问题讨论】:

    标签: java web-services security glassfish wsit


    【解决方案1】:

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

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

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

    【讨论】:

    • 更改 jvm 选项后,我必须将 glassfish 主密码更改为与新服务器密钥库相同的密码。现在我可以再次登录 GLassfish。但是,当我尝试部署耳朵时,出现以下异常:“密钥别名 s1as not found in keystore” 所以 glassfish 将其用于其他事情。就像现在一样,服务器密钥库具有服务器密钥和客户端证书,而客户端密钥库具有客户端密钥和服务器证书。将尝试在 serverkeystore 中创建 s1as 别名。
    猜你喜欢
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2015-02-20
    • 2011-08-10
    • 1970-01-01
    • 2019-06-02
    • 2012-06-20
    • 2020-01-05
    相关资源
    最近更新 更多