1

我正在使用 wsit 创建一个具有一些安全增强功能的网络服务客户端。为了证明一些部署规范的合理性,我不得不使用回调机制来加载密钥库:

<wsp:Policy wsu:Id="WSPortBindingPolicy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsp:ExactlyOne>
        <wsp:All>
            <!-- define a keystore and truststore with the ith certificates for ssl encrypted connections -->
            <sc:KeyStore wspp:visibility="private" callbackHandler="webservice.auth.KeyStoreHandler" />
            <sc:TrustStore wspp:visibility="private" callbackHandler="webservice.auth.KeyStoreHandler"/>

现在根据我的日志文件,KeyStore 处理程序将被正确实例化,但永远不会被调用来创建密钥库。这意味着永远不会调用回调方法“handle(Callback[] callbacks)”。请有人给我一些提示如何更好地分析问题。

实例化的调用堆栈表明该策略已正确解析和设置。但在 SSL 握手期间,不会触发回调。

INFO: WSP5018: WSIT-Konfiguration wurde aus Datei geladen: jar:file:/C:/app.jar!/META-INF/wsit-client.xml.
11:22:08,753 DEBUG [AWT-EventQueue-0] webservice.auth.KeyStoreHandler () : instantiate KeyStoreHandlerjava.lang.Exception
at webservice.auth.KeyStoreHandler.<init>(KeyStoreHandler.java:60)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at java.lang.Class.newInstance0(Class.java:355)
at java.lang.Class.newInstance(Class.java:308)
at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.initNewInstances(DefaultCallbackHandler.java:2022)
at com.sun.xml.wss.impl.misc.DefaultCallbackHandler.<init>(DefaultCallbackHandler.java:344)
at com.sun.xml.wss.jaxws.impl.SecurityClientTube.configureClientHandler(SecurityClientTube.java:823)
at com.sun.xml.wss.jaxws.impl.SecurityClientTube.<init>(SecurityClientTube.java:180)
at com.sun.xml.wss.provider.wsit.SecurityTubeFactory.createTube(SecurityTubeFactory.java:275)
at com.sun.xml.ws.assembler.TubeCreator.createTube(TubeCreator.java:85)
at com.sun.xml.ws.assembler.MetroTubelineAssembler.createClient(MetroTubelineAssembler.java:137)
at com.sun.xml.ws.client.Stub.createPipeline(Stub.java:328)
at com.sun.xml.ws.client.Stub.<init>(Stub.java:297)
at com.sun.xml.ws.client.Stub.<init>(Stub.java:239)
at com.sun.xml.ws.client.Stub.<init>(Stub.java:254)
at com.sun.xml.ws.client.sei.SEIStub.<init>(SEIStub.java:92)
at com.sun.xml.ws.client.WSServiceDelegate.getStubHandler(WSServiceDelegate.java:746)
at com.sun.xml.ws.client.WSServiceDelegate.createEndpointIFBaseProxy(WSServiceDelegate.java:724)
at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:408)
at com.sun.xml.ws.client.WSServiceDelegate.getPort(WSServiceDelegate.java:384)
at javax.xml.ws.Service.getPort(Service.java:175)
4

2 回答 2

3

一些提示如何更好地分析问题:

  1. 为记录器启用 Level.FINEcom.sun.xml.wss.logging你应该会看到一些有用的消息DefaultCallbackHandler

  2. DefaultCallbackHandler#getKeyStoreUsingCallback(Map runtimeProps)在和getPrivateKey(Map runtimeProps, String alias)方法上设置断点。我猜他们根本没有被调用。也许 SSL 根本没有初始化?

  3. 调试 SSL 设置系统属性javax.net.debug=ssl。然后你会看到到底发生了什么。您可以在此处找到更多信息:调试 SSL/TLS 连接

如果您提供输出,那么也许我们将能够为您提供帮助。

于 2013-06-23T15:40:26.747 回答
0

为了证明一些部署规范的合理性,我不得不使用回调机制来加载密钥库

您使用密钥库回调机制来避免提供明文密钥库密钥/密码。

  1. 了解您选择的安全机制,以及密钥库是否用于服务器/客户端:

    密钥库在服务器上用于这些安全机制

    • 用户名认证。带对称键
    • 相互证书。
    • SAML 身份验证。通过 SSL
    • 认可证书。
    • SAML Sender Vouches with Cert.
    • SAML 密钥持有者

    Keystore 在客户端用于这些安全机制

    • 相互证书。
    • 运输部门
    • 消息验证。通过 SSL - 用户名令牌
    • 消息验证。通过 SSL - X.509 令牌
    • SAML 身份验证。通过 SSL
    • 认可证书。
    • SAML Sender Vouches with Cert.
    • SAML 密钥持有者
    • STS 发行代币
    • STS 颁发带有服务证书的令牌。
    • STS 发行背书代币
  2. 了解您的应用服务器/容器和 Java EE 版本是否使用 Keystore:

  3. 了解您的客户端实现以及是否使用了 Keystore:

如果提供了设置/配置的更多详细信息,则可以添加更多步骤。

于 2013-07-02T09:51:22.593 回答