【问题标题】:Username authentification with symmetric key working locally but not in remote server使用对称密钥的用户名身份验证在本地工作但不在远程服务器中
【发布时间】:2012-06-28 13:02:13
【问题描述】:

我有一个使用 netbeans 7 和 glassfish 3.1.2 开发的 jax-ws Web 服务。 我将 Web 服务配置为使用具有对称密钥安全性和默认密钥库的用户名身份验证。 当我在 localhost 中测试我的 Web 服务时,一切正常,但是当我在远程测试服务器中部署它时,它没有工作。 首先,我收到了关于 Key used to decrypt EncryptedKey cannot be null 的异常抱怨,所以我将本地 keystore.jks 和 cacerts.jks 上传到远程服务器。

现在我开始了解这些例外情况:

服务器端:

WSITPVD0035: Error in Verifying Security in Inbound Message. com.sun.xml.wss.impl.PolicyViolationException: com.sun.xml.wss.impl.WssSoapFaultException: Invalid Security Header at 
com.sun.xml.wss.impl.policy.verifier.MessagePolicyVerifier.verifyPolicy(MessagePolicyVerifier.java:151) at 
com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.createMessage(SecurityRecipient.java:1003) at 
com.sun.xml.ws.security.opt.impl.incoming.SecurityRecipient.validateMessage(SecurityRecipient.java:248) at 
com.sun.xml.wss.provider.wsit.WSITServerAuthContext.verifyInboundMessage(WSITServerAuthContext.java:588) at 
com.sun.xml.wss.provider.wsit.WSITServerAuthContext.validateRequest(WSITServerAuthContext.java:361) at 
com.sun.xml.wss.provider.wsit.WSITServerAuthContext.validateRequest(WSITServerAuthContext.java:264) at 
com.sun.enterprise.security.webservices.CommonServerSecurityPipe.processRequest(CommonServerSecurityPipe.java:173) at 
com.sun.enterprise.security.webservices.CommonServerSecurityPipe.process(CommonServerSecurityPipe.java:144) at 
com.sun.xml.ws.api.pipe.helper.PipeAdapter.processRequest(PipeAdapter.java:119) at 
com.sun.xml.ws.api.pipe.Fiber.__doRun(Fiber.java:961) at 
com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:910) at 
com.sun.xml.ws.api.pipe.Fiber.doRun(Fiber.java:873) at 
com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:775) at 
com.sun.xml.ws.server.WSEndpointImpl$2.process(WSEndpointImpl.java:386) at 
com.sun.xml.ws.transport.http.HttpAdapter$HttpToolkit.handle(HttpAdapter.java:640) at 
com.sun.xml.ws.transport.http.HttpAdapter.handle(HttpAdapter.java:263) at 
com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:163) at 
org.glassfish.webservices.Ejb3MessageDispatcher.handlePost(Ejb3MessageDispatcher.java:120) at 
org.glassfish.webservices.Ejb3MessageDispatcher.invoke(Ejb3MessageDispatcher.java:91) at 
org.glassfish.webservices.EjbWebServiceServlet.dispatchToEjbEndpoint(EjbWebServiceServlet.java:200) at 
org.glassfish.webservices.EjbWebServiceServlet.service(EjbWebServiceServlet.java:131) at 
javax.servlet.http.HttpServlet.service(HttpServlet.java:770) at 
com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.doFilter(ServletAdapter.java:1059) at 
com.sun.grizzly.http.servlet.ServletAdapter$FilterChainImpl.invokeFilterChain(ServletAdapter.java:999) at 
com.sun.grizzly.http.servlet.ServletAdapter.doService(ServletAdapter.java:434) at 
com.sun.grizzly.http.servlet.ServletAdapter.service(ServletAdapter.java:384) at 
com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179) at 
com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117) at 
com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354) at 
com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at 
com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849) at 
com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746) at 
com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045) at 
com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228) at 
com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at 
com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at 
com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at 
com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at 
com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at 
com.sun.grizzly.ContextTask.run(ContextTask.java:71) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at 
com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at 
java.lang.Thread.run(Thread.java:662) Caused by: com.sun.xml.wss.impl.WssSoapFaultException: Invalid Security Header at 
com.sun.xml.ws.security.opt.impl.util.SOAPUtil.newSOAPFaultException(SOAPUtil.java:159) at 
com.sun.xml.wss.impl.policy.verifier.MessagePolicyVerifier.processSecondaryPolicy(MessagePolicyVerifier.java:220) at 
com.sun.xml.wss.impl.policy.verifier.MessagePolicyVerifier.verifyPolicy(MessagePolicyVerifier.java:144) ... 43 more

客户端:

Exception in thread "AWT-EventQueue-0" javax.xml.ws.soap.SOAPFaultException: Invalid Security Header
    at com.sun.xml.ws.fault.SOAP11Fault.getProtocolException(SOAP11Fault.java:193)
    at com.sun.xml.ws.fault.SOAPFaultBuilder.createException(SOAPFaultBuilder.java:126)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:123)
    at com.sun.xml.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:93)
    at com.sun.xml.ws.client.sei.SEIStub.invoke(SEIStub.java:144)

我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 您对如何首先使用带有对称密钥的用户名身份验证构建客户端应用程序有任何参考吗?

标签: web-services security jakarta-ee glassfish jax-ws


【解决方案1】:

堆栈跟踪对我来说并不熟悉,但可能您的问题是证书本身

当您创建证书时,您应该设置一个“服务器名称”。客户端将使用它来检查证书的“服务器名称”是否与 URL 的“服务器名称”匹​​配。如果服务器名称不匹配,客户端应该中止连接,因为它可能是被盗的证书!!!。欲了解更多信息,请查看此tutorial

以 java 客户端为例:如果您为 'localhost' 客户端创建证书 当且仅当它使用 URL 访问 Web 服务时,验证才会通过 喜欢'https://localhost/stuff...'。因此,如果您尝试使用相同的客户端访问相同的应用程序,但使用'https://10.0.0.1/stuff...' 之类的 IP,则会出现验证错误。

注意:Java Web 服务客户端的默认配置会执行此检查,但如果您想绕过此客户端验证,请检查this post

尝试检查这是否是您遇到的问题。如果是这种情况,您有几种解决方案:

  • 为要部署的服务器创建证书 应用
  • 禁用客户端验证

PS:我从来没有在服务器端做过什么特别的事情来解决这类问题。安装正确的证书就足够了

【讨论】:

  • 您是否认为网络服务的客户端描述中缺少某些内容?
  • 不,不是关于 Web 服务客户端描述符,而是它如何验证证书。实际上,这不仅与 Web 服务客户端有关,还与任何 HTTP 客户端有关。尝试执行适合您的本地测试,但不要在客户端的端点 URL 中使用 localhost,而是使用您机器的 IP。如果您遇到相同的错误,则问题在于证书生成,而不是您的 Web 服务定义/实现。
  • IP 访问 web 服务失败,因为奇怪的是 glassfish 无法使用真实 ip 访问。我尝试使用 127.0.0.1 而不是 localhost 并且成功了。
  • 如果它适用于 127.0.0.1 可能你的问题不是证书服务器名称。但是为了确定我是不是你,我会在“测试服务器”中使用与服务器 IP 匹配的证书再次测试。
  • 如何使用服务器 ip 生成证书?我必须创建 x509 还是 ssl 证书?
【解决方案2】:

就我而言,问题出在 CommandMap 中。需要在 CommandMap 中添加“应用程序/密码值”处理程序,因为 WSIT 在加载 CVDataHandler 类时只执行一次。

有关如何添加的更多详细信息,请参阅 com.sun.xml.ws.security.opt.impl.util.CVDataHandler 静态块。

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-04
    • 2017-02-06
    • 2020-11-08
    • 1970-01-01
    相关资源
    最近更新 更多