9

我正在尝试访问受证书保护的 Web 服务。安全性是在 IIS 上设置的,Web 服务在其背后。

我认为 WS-SECURITY 不会进行这种类型的身份验证。调用Web服务时有什么方法可以通过客户端证书吗?

我刚刚收到一个 IIS 错误页面,上面写着“该页面需要客户端证书”。

我正在使用 CXF 2.1.4

4

4 回答 4

7

是的,这可以使用 CXF。您将需要设置客户端管道。您可以指定包含允许您访问 IIS 中的 Web 服务的证书的密钥库。只要您在此处使用的证书是 IIS 中已知的允许客户端,就可以了。

<http:conduit name="{http://apache.org/hello_world}HelloWorld.http-conduit">

   <http:tlsClientParameters>
       <sec:keyManagers keyPassword="password">
            <sec:keyStore type="JKS" password="password"
                 file="src/test/java/org/apache/cxf/systest/http/resources/Morpit.jks"/>
       </sec:keyManagers>
       <sec:trustManagers>
           <sec:keyStore type="JKS" password="password"
                file="src/test/java/org/apache/cxf/systest/http/resources/Truststore.jks"/>
       </sec:trustManagers>

       ...

   </http:tlsClientParameters>

样本来自:CXF Wiki

于 2009-02-23T13:29:04.003 回答
1

上面的答案是正确的,但增加了......

您的客户端 bean 应如下所示(此 SSL 工作正常):

<jaxws:client id="helloClient" serviceClass="demo.spring.HelloWorld" address="http://localhost:9002/HelloWorld" />

如果您将客户端 bean 定义为以下 SSL 将不起作用:

<bean id="proxyFactory" 
class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass" value="demo.spring.HelloWorld"/>
<property name="address" value="http://localhost:9002/HelloWorld"/>
</bean> 
于 2012-07-05T06:49:18.027 回答
1

正如@geg 所提到的,您需要将拦截器添加到您的 JaxWsProxyFactoryBean 并使用 HttpConduit。

是您可以参考的示例代码。
代码将指导如何设置 TLSClientParameters

于 2018-03-14T03:44:53.040 回答
0

要以编程方式执行此操作,请创建一个拦截器并将其添加到您的JaxWsProxyFactoryBeanwith factory.getOutInterceptors().add(new TLSInterceptor()).

public class TLSInterceptor extends AbstractPhaseInterceptor<Message> {

    public TLSInterceptor() {
        super(Phase.SETUP);
    }

    @Override
    public void handleMessage(final Message message) throws Fault {
            final Conduit conduit = message.getExchange().getConduit(message);
            if (conduit instanceof HTTPConduit) {
                final HTTPConduit httpConduit = (HTTPConduit) conduit;
                final TLSClientParameters tlsClientParameters = ObjectUtils.firstNonNull(httpConduit.getTlsClientParameters(), new TLSClientParameters());

               // configure the params

                httpConduit.setTlsClientParameters(tlsClientParameters);
            }
        }
}
于 2017-01-31T15:59:16.510 回答