Trước tiên, tôi sẽ bắt đầu với một bản tóm tắt. Tôi đang sử dụng ứng dụng khách Apache CXF để giao tiếp qua SSL với nhà cung cấp dịch vụ Apache CXF đang sử dụng chứng chỉ tự ký. Tôi đã nhập chứng chỉ vào kho ủy nhiệm WebSphere trên máy chủ khách, nhưng tôi vẫn nhận được một "javax.net.ssl.SSLHandshakeException: SSLHandshakeException gọi https://somesvcprovider.com/appname/svc/myservice: com.ibm.jsse2.util.h: Không có chứng chỉ đáng tin cậy nào được tìm thấy" ngoại lệ.Cách thiết lập ứng dụng khách Apache CXF để sử dụng WebSphere truststore? (Nhận được "Không tìm thấy chứng chỉ đáng tin cậy" ngoại lệ.)
Bây giờ, đây là chi tiết:
Tôi có một khách hàng dịch vụ web Apache CXF mà tôi đang cấu hình sử dụng Spring, và khách hàng được triển khai tới một máy chủ ứng dụng WebSphere 6.1. Máy khách CXF liên lạc với nhà cung cấp dịch vụ Apache CXF trên một máy chủ WebSphere khác. Giao tiếp sử dụng SSL.
Nhà cung cấp dịch vụ đang sử dụng chứng chỉ tự ký. Tôi đã nhập chứng chỉ của nhà cung cấp vào kho ủy thác WebSphere trên máy chủ khách thông qua bảng điều khiển quản trị. Tôi đã thực hiện việc này bằng cách chuyển tới chứng chỉ SSL và quản lý khóa> Cấu hình SSL> NodeDefaultSSLSettings> Cửa hàng và chứng chỉ> NodeDefaultTrustStore> Chứng chỉ người ký; sau đó tôi sử dụng công cụ "Lấy từ cổng" để nhập chứng chỉ.
Tuy nhiên, tôi vẫn nhận được lỗi này khi cố gắng liên hệ với nhà cung cấp dịch vụ: "javax.net.ssl.SSLHandshakeException: SSLHandshakeException gọi https://somesvcprovider.com/appname/svc/myservice: com.ibm.jsse2.util.h: Không tìm thấy chứng chỉ đáng tin cậy".
Các tập tin cấu hình Spring như sau:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:sec="http://cxf.apache.org/configuration/security"
xmlns:http="http://cxf.apache.org/transports/http/configuration"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://cxf.apache.org/configuration/security
http://cxf.apache.org/schemas/configuration/security.xsd
http://cxf.apache.org/transports/http/configuration
http://cxf.apache.org/schemas/configuration/http-conf.xsd
http://cxf.apache.org/jaxws
http://cxf.apache.org/schemas/jaxws.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<http:conduit name="*.http-conduit">
<!-- deactivate HTTPS url hostname verification (localhost, etc) -->
<!-- WARNING ! disableCNcheck=true should not used in production. -->
<http:tlsClientParameters disableCNCheck="true" />
</http:conduit>
<!-- Read properties from property file(s). -->
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<!-- The *.spring.properties files are prefixed with a system property
that is set on the WebSphere server. -->
<value>classpath:spring.${my.env}.properties</value>
</list>
</property>
</bean>
<jaxws:client id="myServiceClient"
serviceClass="com.client.stub.cxf.IMyService"
address="${my.svc.url}" />
<bean id="myReport" class="com.client.MyReportRequestor">
<property name="client" ref="myServiceClient"/>
</bean>
</beans>
Như đã trình bày ở trên, khách hàng CXF được tiêm qua một setter bởi Spring. Các mã để liên lạc với dịch vụ là bên dưới:
List<String> formNames = client.retrieveNames(formIdsList);
Ngoài ra, tôi không biết nếu điều này có liên quan, nhưng không có nhà quản lý tin tưởng được trả về khi tôi kiểm tra việc TLSClientParameters đối tượng trên máy khách CXF khi chạy. Mã để thực hiện việc kiểm tra dưới đây:
// Get the trust managers for this client.
Client proxy = ClientProxy.getClient(client);
HTTPConduit conduit = (HTTPConduit) proxy.getConduit();
TLSClientParameters tls = conduit.getTlsClientParameters();
TrustManager[] trustManagers = tls.getTrustManagers(); // trustManagers is null
Có điều gì khác mà tôi cần làm để yêu cầu khách hàng Apache CXF tin tưởng chứng chỉ tự ký không?
Tôi không muốn chỉ định đường dẫn đến một truststore cùng với mật khẩu trong tệp cấu hình.
Cảm ơn bạn!
Tôi không thể tìm cách sử dụng WAS truststores, vì vậy, tôi sẽ giả định rằng bạn phải chỉ định truststore trong tệp cấu hình như bạn đã đề cập. –
Tôi tìm giải pháp @kjetil khả thi hơn, vì nó không yêu cầu phát triển tùy chỉnh –