2009-02-12 17 views
7

Tôi đang cố truy cập dịch vụ web được chứng nhận bằng chứng chỉ. Bảo mật được thiết lập trên IIS và dịch vụ web nằm phía sau nó.Làm cách nào để bạn sử dụng Xác thực TLS/SSL Http với ứng dụng khách CXF vào dịch vụ web?

Tôi không nghĩ WS-SECURITY sẽ thực hiện loại xác thực này. Có cách nào để chuyển chứng chỉ ứng dụng khách khi bạn gọi dịch vụ web không?

Tôi chỉ nhận được Trang lỗi IIS cho biết "Trang yêu cầu chứng chỉ khách hàng ".

Tôi đang sử dụng CXF 2.1.4

Trả lời

7

Có, điều này có thể sử dụng CXF. Bạn sẽ cần phải thiết lập ống dẫn khách hàng. Bạn có thể chỉ định kho khóa chứa các chứng chỉ cho phép bạn truy cập dịch vụ web trong IIS. Miễn là chứng chỉ bạn đang sử dụng ở đây là một máy khách được cho phép trong IIS, bạn nên ổn.

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

mẫu từ: CXF Wiki

1

Trên câu trả lời là đúng nhưng thêm vào đó ....

đậu Khách hàng của bạn sẽ như sau (đối với SSL này làm việc tốt):

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

Nếu bạn xác định bean khách hàng như sau SSL sẽ không hoạt động:

<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

Để làm điều đó theo chương trình, hãy tạo trình chặn và thêm nó vào JaxWsProxyFactoryBean với 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); 
      } 
     } 
}