2009-02-12 13 views
7

Próbuję uzyskać dostęp do usługi internetowej zabezpieczonej certyfikatem. Zabezpieczenia są skonfigurowane w usługach IIS, a usługa sieci Web jest za nim.W jaki sposób korzysta się z uwierzytelniania TLS/SSL Http z klientem CXF do usługi WWW?

Nie sądzę, że WS-SECURITY wykona tego typu uwierzytelnianie. Czy istnieje sposób przekazywania certyfikatu klienta podczas wywoływania usługi WWW?

Właśnie otrzymuję stronę błędu IIS, która mówi "Strona wymaga certyfikatu klienta ".

Używam CXF 2.1.4

Odpowiedz

7

Tak, jest to możliwe przy użyciu CXF. Będziesz musiał ustawić kanał klienta. Można określić magazyn kluczy zawierający certyfikaty, które umożliwiają dostęp do usługi WWW w usługach IIS. Tak długo, jak certyfikat, którego używasz, jest znanym dozwolonym klientem w IIS, powinieneś być w porządku.

<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> 

Próbka z: CXF Wiki

1

powyższa odpowiedź jest poprawna, ale dodając do tego ....

Twój fasola klient powinien być w następujący sposób (w tym SSL działa poprawnie):

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

Jeśli zdefiniujesz komponent bean klienta w następujący sposób, protokół SSL nie będzie działał:

<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

Aby to zrobić programowo, utwórz przechwytywacz i dodaj go do swojego JaxWsProxyFactoryBean z 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); 
      } 
     } 
}