2013-05-14 17 views
6

Tôi muốn tạo ứng dụng Spring 3 (v 3.1.1.RELEASE) (trên Java 1.6) để giao tiếp với dịch vụ web HTTPS đang sử dụng một chứng chỉ tự ký mà tôi đã tạo. Tôi đang bối rối về cách thiết lập các truststores và keystones của mình. Sử dụng chứng chỉ tự ký của tôi, tôi tạo ra một yếu tố quyết định sử dụng các lệnh dưới đây ..."Đã nhận cảnh báo chết người: handshake_failure" khi cố gắng kết nối với dịch vụ web https

openssl pkcs12 -export -in server.crt -inkey server.key \ 
      -out server.p12 -name myalias 

keytool -importkeystore -deststorepass password -destkeypass password -deststoretype jks -destkeystore server.keystore -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass password -alias myalias 

Sau đó, tôi được cấu hình ứng dụng Spring của tôi như vậy ...

<http-conf:conduit name="*.http-conduit"> 
      <http-conf:tlsClientParameters secureSocketProtocol="SSL" disableCNCheck="true"> 
        <sec:trustManagers> 
         <sec:keyStore type="JKS" password="password" resource="server.keystore" /> 
        </sec:trustManagers> 
        <sec:keyManagers keyPassword="password"> 
         <sec:keyStore type="pkcs12" password="password" resource="server.p12" /> 
        </sec:keyManagers> 
      </http-conf:tlsClientParameters> 
    </http-conf:conduit> 

    <jaxws:client id="orgWebServiceClient" 
      serviceClass="org.mainco.bsorg.OrganizationWebService" address="${wsdl.url}" /> 

nhưng khi tôi chạy ứng dụng của tôi, tôi nhận được lỗi dưới đây. Tôi đã bỏ lỡ điều gì?

Caused by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://nonprod.cbapis.org/qa2/bsorg/OrganizationService: Received fatal alert: handshake_failure 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [classes.jar:1.6.0_45] 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) [classes.jar:1.6.0 _45] 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) [classes.jar:1.6.0_45] 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) [classes.jar:1.6.0_45] 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1458) [cxf-rt-transports-http-2.6.0.jar:2.6.0] 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1443) [cxf-rt-transports-http-2.6.0.jar:2.6.0] 
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:659) [cxf-rt-transports-http-2.6.0.jar:2.6.0] 
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262) [cxf-api-2.6.0.jar:2.6.0 ] 
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:532) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:89) [cxf-rt-frontend-simple-2.6.0.jar:2.6.0] 
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134) [cxf-rt-frontend-jaxws-2.6.0.jar:2.6.0] 
... 5 more 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) [jsse.jar:1.6] 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) [jsse.jar:1.6] 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1822) [jsse.jar:1.6] 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1004) [jsse.jar:1.6] 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188) [jsse.jar:1.6] 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215) [jsse.jar:1.6] 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199) [jsse.jar:1.6] 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) [jsse.jar:1.6] 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) [jsse.jar:1.6] 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1014) [classes.jar:1.6.0_45] 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230) [jsse.jar:1.6] 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1395) [cxf-rt-transports-http-2.6.0.jar:2.6.0] 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1337) [cxf-rt-transports-http-2.6.0.jar:2.6.0] 
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) [cxf-api-2.6.0.jar:2.6.0] 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1415) [cxf-rt-transports-http-2.6.0.jar:2.6.0] 
... 15 more 
+0

Xin chào Dave, chúng tôi cần thêm một số thông tin. Vì vậy, dịch vụ web HTTPS của bạn đang chạy trên máy chủ ứng dụng nào, Tomcat? Ứng dụng mùa xuân của bạn có đang chạy trên cùng một máy chủ vật lý hay một máy chủ riêng biệt không? – Hiro2k

+4

Bạn có thể thêm điều này vào JVM args: '-Djavax.net.debug = ssl, bắt tay, thất bại' và đăng kết quả của nhật ký không? – Avi

+0

Ngoài ra, bạn có thể nhìn vào một câu hỏi tương tự của tôi, trong đó tôi đã có cùng một vấn đề và tôi đăng tất cả mọi thứ tôi đã kiểm tra sau khi rất nhiều điều tra dẫn tôi đến câu trả lời: http://stackoverflow.com/questions/15544116/sslhandshakeexception -xác nhận-chết-cảnh báo-bắt tay-thất bại-khi-thiết lập-ciph – Avi

Trả lời

0

Dưới đây là trình tự của điều bạn cần phải kiểm tra:

  1. Kiểm tra cho entry của bạn trong keystore sử dụng keytool -list. Tham khảo this bài viết cho cú pháp
  2. Kiểm tra nếu có một bộ chung của bộ mã hoá được hỗ trợ giữa máy khách và máy chủ của bạn
  3. Cuối cùng, chỉ những tập tin để .jks trong cả keyManagerstrustManagers như đã đề cập trong cxf documentation
0

Bạn phải có chứng chỉ SSL chính xác trong kho khóa của bạn, của máy chủ mà bạn đang cố kết nối.

Bạn có thể tạo Keystore bằng phương thức được cung cấp here.

Kiểm tra các ví dụ này. Đây là những gì làm việc cho tôi.

example 1example 2

+0

Chứng chỉ của bạn phải ở trong kho khóa, chứng chỉ của máy chủ mà bạn đang cố gắng kết nối phải ở trong kho lưu trữ tin cậy hoặc cửa hàng chứng chỉ java. – Raymond

3

Nếu bạn không phải làm một hai chiều ý nghĩa xác thực SSL, máy chủ của bạn không quan tâm về việc ai là khách hàng vì vậy nó không cần phải kiểm tra và xác minh chứng nhận của khách hàng; sau đó trong trường hợp đó, tất cả những gì bạn cần ở phía máy khách chỉ là một kho lưu trữ tin cậy có chứa một danh sách các chứng chỉ máy chủ đáng tin cậy. Trong trường hợp của bạn, truststore khách hàng của bạn sẽ chỉ chứa chứng chỉ máy chủ tự ký và đó là tất cả. Nó là thực tế thông thường trong java để có truststore của bạn ở định dạng .jks. Nếu bạn quản lý để tạo ra một truststore sau đó bạn được thiết lập. Về phía máy chủ, bạn không cần lo lắng về truststore nhưng cần phải cấu hình máy chủ để có chứng chỉ máy chủ hợp lệ.

Trong xác thực SSL hai chiều, bạn cần kho khóa và kho tin cậy được định cấu hình ở cả phía máy khách và phía máy chủ. Client truststore sẽ vẫn giữ nguyên như trong trường hợp xác thực 1 chiều. Máy chủ ủy thác phải chứa chứng chỉ ứng dụng khách tự ký. Cả hai máy khách và máy chủ nên được cấu hình để sử dụng các chứng chỉ tương ứng của chúng mà chúng trình bày cho mỗi othe trong quá trình bắt tay SSL. Trong quá trình bắt tay, cả hai bên xác minh chứng chỉ của nhau đối với truststore của họ và thiết lập danh tính của bên đối diện. Và một khi danh tính được thiết lập thì bạn sẽ có thể thiết lập kết nối.

Để tạo cửa hàng, tôi khuyên bạn nên sử dụng công cụ có tên là Portecle có thể khá tiện dụng.

+0

"thì trong trường hợp đó, tất cả những gì bạn cần ở phía máy khách chỉ là một kho lưu trữ tin cậy chứa danh sách chứng chỉ máy chủ đáng tin cậy" Điều gì sẽ xảy ra nếu bạn đang truy cập vào máy chủ https dựa trên đầu vào của người dùng. Vì vậy, bạn không biết các máy chủ trước thời hạn. Bạn sẽ làm gì trong trường hợp đó? – Rose

Các vấn đề liên quan