Как использовать аутентификацию TLS / SSL Http с клиентом CXF для веб-службы? - PullRequest
8 голосов
/ 13 февраля 2009

Я пытаюсь получить доступ к веб-службе, защищенной сертификатом. Безопасность настроена на IIS, и за ней стоит веб-служба.

Я не думаю, что WS-SECURITY будет выполнять такой тип аутентификации. Есть ли способ передать сертификат клиента при вызове веб-службы?

Я только что получил страницу с ошибкой IIS, которая говорит: «Страница требует Сертификат клиента ".

Я использую CXF 2.1.4

Ответы [ 4 ]

7 голосов
/ 23 февраля 2009

Да, это возможно с использованием CXF. Вам нужно будет установить клиентский канал. Вы можете указать хранилище ключей, содержащее сертификаты, которые позволят вам получить доступ к веб-службе в IIS. Если используемый здесь сертификат является известным разрешенным клиентом в 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 голос
/ 14 марта 2018

Как уже упоминалось @geg, вам нужно добавить перехватчик к вашему JaxWsProxyFactoryBean и использовать HttpConduit.

Здесь - это пример кода, который вы можете использовать.
этот код поможет вам настроить TLSClientParameters

1 голос
/ 05 июля 2012

Над ответом правильный, но добавляя к этому ....

Ваш клиентский компонент должен быть следующим (для этого SSL работает нормально):

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

Если вы определите клиентский компонент как следующий, 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> 
0 голосов
/ 31 января 2017

Чтобы сделать это программно, создайте перехватчик и добавьте его к вашему 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);
            }
        }
}
...