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-empty và got 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
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