我正在尝试访问由证书保护的Web服务。 安全性在IIS上设置,Web服务就在它后面。
我认为WS-SECURITY不会进行此类身份验证。 有没有办法在调用Web服务时传递客户端证书?
我刚刚收到一个IIS错误页面,上面写着“该页面需要一个 客户证书“。
我正在使用CXF 2.1.4
答案 0 :(得分: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
答案 1 :(得分: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>
答案 2 :(得分:1)
正如@geg所提到的,你需要在你的JaxWsProxyFactoryBean中添加拦截器并使用HttpConduit。
答案 3 :(得分:0)
要以编程方式执行此操作,请创建一个拦截器并使用JaxWsProxyFactoryBean
将其添加到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);
}
}
}