【发布时间】: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