2013-02-13 29 views
6

Tôi sẽ bắt đầu với thực tế là tôi có kiến ​​thức không nhiều về việc thiết lập keystore, vv trong JavaCalling WebService và có SSL/cert vấn đề

Tôi cố gắng để gọi một dịch vụ web SOAP, tôi có wsdl , tạo ra mã, vv Mọi thứ có vẻ ổn cho đến khi tôi triển khai nó và cố kích hoạt cuộc gọi WS.

Đây là thiết lập của tôi:

  • Tomcat 7.0.35
  • Java, jdk 1.6.0_39
  • tập tin PFX và mật khẩu
  • dự án triển khai như ứng dụng web chuẩn (chiến tranh) để tomcat

Khi tôi chạy mã, tôi có ngoại lệ sau:

Caused by: javax.net.ssl.SSLHandshakeException: SSLHandshakeException invoking https://tallyservices-qa.olson.com/tallyDemo2WebServices/tallyDemo2/sms: Received fatal alert: certificate_unknown 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1336) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1320) 
    at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) 
    at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:622) 
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) 
    ... 27 more 
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
    at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1837) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1019) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1203) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1230) 
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1214) 
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1031) 
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230) 
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:170) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1280) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1231) 
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:183) 
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47) 
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) 
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1293) 
    ... 30 more 

Tôi làm theo các gợi ý ở đây: How to convert .pfx file to keystore with private key? để cài đặt các cert để keystore của tôi:

keytool -importkeystore -srckeystore C:\somefolder\mypfxfile.pxf -srcstoretype pkcs12 
-destkeystore C:\somefolder\clientcert.jks -deststoretype JKS 

và tôi đã nhận:

Enter destination keystore password: <mypassword> 
Re-enter new password: <mypassword> 
Enter source keystore password: <pxf_password> 
Entry for alias 67eb31f6 successfully imported. 
Import command completed: 1 entries successfully imported, 0 entries failed or 
cancelled 

Vì vậy, tất cả mọi thứ có vẻ tốt cho đến nay, tôi bật tomcat của tôi và nhấn Servlet lần nữa và tôi vẫn gặp lỗi tương tự.

Tôi còn thiếu gì nữa ở đây? Tôi có cần nói với tomcat về chứng chỉ hay gì đó không?

Cảm ơn trước sự giúp đỡ và lời xin lỗi vì sự noob-ness của tôi trong kho khóa và khu vực chứng chỉ.

EDIT: Vì vậy, tôi đã tìm từ Carlo Pellegrini`s giúp đỡ, mà tôi cần phải thêm keystore để tomcat: vì vậy bây giờ, tomcat của tôi được bắt đầu với tham số JAVA_OPTS thêm:

"-Djavax.net.ssl.trustStore=C:\somefolder\clientcert.jks -Djavax.net.ssl.trustStorePassword=somepassword" 

và bây giờ tôi nhận được:

Caused by: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 

Từ đây: Error - trustAnchors parameter must be non-emptygot java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty when using cas - có vẻ như truststore tôi không tìm thấy?

I figured lệnh trước đó của tôi:

keytool -importkeystore -srckeystore C:\somefolder\mypfxfile.pxf -srcstoretype pkcs12 -destkeystore C:\somefolder\clientcert.jks -deststoretype JKS 

Trên thực tế đặt pxf vào keystore, không phải là truststore?

Khi tôi kiểm tra danh sách keystore:

C:\somefolder>keytool -list -keystore "C:\somefolder\clientcert.jks" 
Enter keystore password: 

Keystore type: JKS 
Keystore provider: SUN 

Your keystore contains 1 entry 

67eb31f6, 13-Feb-2013, PrivateKeyEntry, 
Certificate fingerprint (MD5): ... some fingerprint ... 

Vì vậy, tôi không chắc chắn những gì tôi thiếu ở đây

+0

Tôi không biết thiết lập chính xác trong trường hợp này, nhưng nếu bạn đang đăng ký hoặc mã hóa tin nhắn của mình bằng khóa riêng, máy chủ sẽ có khóa công cộng. Nếu nó chỉ là ssl/tls như là ngoại lệ cho thấy, có thể có một vấn đề với chứng chỉ máy chủ không được tin cậy? – jhexp

Trả lời

3

Tôi đã tìm thấy giải pháp, tôi nên sử dụng keyStore thay vì so với trustStore, nhưng quan trọng hơn, dường như có vấn đề với thư viện tôi đang sử dụng (cxf 2.7.1) mà tôi phải thiết lập thuộc tính SSL trực tiếp trong mã:

// BEGIN FIX to avoid certificate error, need to set this up in the code for cxf 
String storePath = System.getProperty("javax.net.ssl.keyStore"); 
String storePassword = System.getProperty("javax.net.ssl.keyStorePassword"); 
String storeType = System.getProperty("javax.net.ssl.keyStoreType"); 
KeyStore keyStore = KeyStore.getInstance(storeType); 
keyStore.load(new FileInputStream(storePath), storePassword.toCharArray()); 
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
factory.init(keyStore, storePassword.toCharArray()); 
KeyManager[] keyManagers = factory.getKeyManagers(); 
Client client = ClientProxy.getClient(port); 
HTTPConduit conduit = (HTTPConduit) client.getConduit(); 
conduit.setTlsClientParameters(new TLSClientParameters()); 
conduit.getTlsClientParameters().setKeyManagers(keyManagers); 
5

Bạn cần phải tin tưởng vào chứng chỉ máy chủ.Dưới đây là làm thế nào để làm điều đó:

Sử dụng Chrome (hướng dẫn borwsers khác có thể thay đổi):

  • Surf đến các trang web dịch vụ. (ví dụ: https://localhost/myService)
  • Nếu trình duyệt không tin tưởng, hãy nhấp vào Proceed anyway, nhấp vào biểu tượng ổ khóa trong thanh địa chỉ của bạn và không có cửa sổ bật lên, chọn tab Connection và liên kết Certificate Information.
  • Điều này sẽ mở cửa sổ trình xem chứng chỉ, tại đó, chọn Details, bạn nên xem nút Export .... Chọn Base 64 được mã hóa, một chứng chỉ và lưu nó dưới dạng tệp mysite.cer.

Điều này sẽ nhận được chứng chỉ, bây giờ bạn cần nhập chứng chỉ vào cửa hàng ủy thác.

Bây giờ import chứng chỉ trong một keystore:

keytool -import -file mysite.cer -keystore mykeystore 

này tạo ra một tập tin mới tập keystore mykeystore trong thư mục hiện hành.

Cuối cùng khởi động ứng dụng khách hàng dịch vụ web bằng cách sử dụng tham số JVM javax.net.ssl.trustStore như trong:

java -Djavax.net.ssl.trustStore=mykeystore ... MyClientClass 

Hoặc nếu bạn đang sử dụng Tomcat trong Windows:

set JAVA_OPTS=-Djavax.net.ssl.trustStore=mykeystore 
startup.bat 

Hoặc nếu bạn đang sử dụng Tomcat trong Unix :

export JAVA_OPTS="-Djavax.net.ssl.trustStore=mykeystore" 
startup.sh 
+0

Trong trường hợp này, máy khách dịch vụ web là tomcat của tôi? vì webapp của tôi kết nối với dịch vụ web đang chạy bên trong tomcat. Làm thế nào để tôi đặt tomcat nhìn vào kho khóa? –

+0

Đã chỉnh sửa theo yêu cầu của bạn. –

+0

Cảm ơn, tôi đã tiến bộ ... nhưng có vẻ như bây giờ tôi đã gặp vấn đề về kho lưu trữ vs keystore –