2009-05-06 15 views
7

Tôi đang cố gắng đọc từ trang web bảo mật (ví dụ: SSL), trong mã Java. Tôi đang cố gắng sử dụng cả hai URLConnection (java.net) và HTTPClient của Apache. Trong cả hai trường hợp, khi tôi thực hiện theo yêu cầu, tôi nhận được ngoại lệ này:Không thể xác thực trang web SSL trong java: "pathLenConstraint vi phạm - cert này phải là chứng chỉ cuối cùng trong đường dẫn chứng nhận"

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: đường PKIX xác nhận thất bại: java.security. cert.CertPathValidatorException: trở ngại cơ bản hãy kiểm tra thất bại: pathLenConstraint vi phạm - cert này phải là cert cuối cùng trong đường dẫn xác nhận tại com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:150) tại com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal (SSLSock etImpl.java:1518) tại com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:174) tại com.sun.net.ssl.internal.ssl.Handshaker.fatalSE (Handshaker.java:168) tại com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:848) tại com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage (ClientHandshaker.java:106) tại com.sun.net.ssl.internal.ssl.Handshaker.processLoop (Handshaker.java:495) tại com.sun.net.ssl.internal.ssl.Handshaker.process_record (Handshaker.java:433) tại com.sun.net.ssl.internal.ssl.SSLSocketIm pl.readRecord (SSLSocketImpl.java:818) tại com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1030) tại com.sun.net.ssl.internal.ssl. SSLSocketImpl.startHandshake (SSLSocketImpl.java:1057) tại com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1041) tại sun.net.www.protocol.https.HttpsClient. afterConnect (HttpsClient.java:402) tại sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect (AbstractDelegateHttpsURLConnection.java:166) tại sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection. java: 934) tại sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream (HttpsURLConnectionImpl.java:234) tại com.sap.river.coghead.rest.Main.testJavaHTTPConnection (Main.java:45) tại com .sap.river.coghead.rest.Main.main (Main.java:32) Gây ra bởi: sun.security.validator.ValidatorException: Xác thực đường dẫn PKIX không thành công: java.security.cert.CertPathValidatorException: ràng buộc cơ bản kiểm tra không thành công: đường dẫnLenConstraint vi phạm - chứng chỉ này phải là chứng nhận cuối cùng trong đường dẫn chứng nhận tại sun.security.validator.PKIXValidator.doValidate (PKIXValida tor.java:187) tại sun.security.validator.PKIXValidator.engineValidate (PKIXValidator.java:139) tại sun.security.validator.Validator.validate (Validator.java:203) tại com.sun .net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted (X509TrustManagerImpl.java:172) tại com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted (SSLContextImpl.java: 320) tại com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (ClientHandshaker.java:841) ... 13 hơn gây ra bởi: java.security.cert.CertPathValidatorException: hạn chế cơ bản hãy kiểm tra thất bại: pathLenConstraint vi phạm - cert này phải là cert cuối cùng trong đường dẫn xác nhận tại sun.security.provider.certpath.PKIXMasterCertPathValidator.validate (PKIXMasterCertPathValidator.java:139) tại sun.security.provider.certpath .PKIXCertPathValidator.doValidate (PKIXCertPathValidator.java:316) tại sun.security.provider.certpath.PKIXCertPathValidator.engineValidate (PKIXCert PathValidator.java:178) tại java.security.cert.CertPathValidator.validate (CertPathValidator.java:206) tại sun.security.validator.PKIXValidator.doValidate (PKIXValidator.java:182) ... chi tiết 18

Lưu ý rằng tôi đã thành công trong việc thiết lập kết nối không ssl, đến một máy chủ lưu trữ khác. Tôi cũng có thể xem trang này bằng trình duyệt - chứng chỉ được xác thực chính xác ở đó.

Bạn có cần phải bằng cách nào đó thay đổi thứ tự chứng chỉ khi chúng được truy xuất từ ​​máy chủ không? Tôi có thiếu một số cấu hình không?

Cảm ơn trước,

Lior

Trả lời

6

tôi đào ở xa hơn và câu trả lời nằm trong thực tế là tôi cần phải nhập chứng chỉ cần thiết vào keystore được sử dụng bởi JVM để xác thực SSL. Kho lưu trữ khóa là tệp 'cacerts' trong thư mục jre/lib/security trong jre được sử dụng để chạy chương trình.

Tôi đã xuất thủ công chứng chỉ của trang web - tất cả chúng.
Sau đó, tôi đã nhập nó vào kho khóa mặc định của mình bằng tiện ích 'keytool' do Sun cung cấp. Lưu ý rằng bạn phải nhập chúng theo đúng thứ tự.
Sau đó tôi đặt kho khóa mới thay vì kho khóa của JRE - và nó đã hoạt động.

Tôi đoán sẽ tốt hơn nếu nhập trực tiếp chứng chỉ vào kho khóa của JRE, nhưng công cụ đã hỏi tôi mật khẩu mà tôi không biết.

Tôi tin rằng đó cũng là một cách để lập trình xung quanh điều này dễ dàng hơn, chỉ chưa tìm thấy nó. Tôi sẽ rất vui khi nhận được một số con trỏ (lớp TrustManager trong JSSE?).

Cuối cùng, một số tín dụng. Bài đăng này ở đây: http://javaishdiscoveries.blogspot.com/2009/02/battle-with-cacerts-and-https.html đã giúp chỉ cho tôi đúng hướng.

+0

Tôi không biết điều này có hữu ích hay không, nhưng Java cho phép bạn thay đổi SLLSocketFactory mặc định. – Powerlord

+0

vâng, tôi tưởng tượng tôi cần phải làm gì đó trong khu vực đó. Chỉ cần điều tra thêm. Cảm ơn, - Lior – Lior

+2

FYI, mật khẩu cho kho khóa Java chứng chỉ mặc định $ JAVA_HOME/lib/security/cacerts là 'changeit' –

0

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: Xác thực đường dẫn PKIX không thành công: java.security.cert.CertPathValidatorException: hạn chế cơ bản kiểm tra thất bại: pathLenConstraint vi phạm - cert này phải là cert cuối cùng trong đường dẫn xác nhận tại

pathLenConstraint

See (Lưu ý về chuỗi chứng chỉ) trong

http://groups.google.com/group/google-checkout-developers-forum/web/google-checkout-and-ssl-certificates?version=49

google nói rằng nó có thể là vấn đề với thứ tự chuỗi chứng chỉ, tôi vừa phát hiện ra rằng chứng chỉ của tôi không theo thứ tự, chưa được khắc phục, làm việc trên nó. Tôi sẽ cập nhật điều này sau.


bài cũ:

Có gần như cùng một vấn đề.

Thêm hướng dẫn sử dụng chứng chỉ vào kho khóa giúp, nhưng tôi muốn làm điều đó tự động hơn, với khách hàng của tôi.

Vì vậy, giải pháp của tôi:

tôi sẽ sử dụng keystore chỉ dành riêng cho một ứng dụng này, và một máy chủ 1. keystore không tồn tại - tạo với một số mật khẩu được tạo ra 2. tiết kiệm mật khẩu trong tập tin cấu hình 3. hỏi người dùng (hoặc không) cho dù anh ta muốn chấp nhận chứng chỉ này 4. nếu có - lưu nó vào kho khóa và sử dụng nó khi cần

Đây có phải là giải pháp tốt không? Có ý kiến ​​gì không?

0

Sự cố xảy ra với thứ tự chuỗi chứng chỉ. Đó là: A-> C-> B, nhưng phải là A-> B-> C, khi chúng tôi đã cố định thứ tự chuỗi, ứng dụng bắt đầu hoạt động.


Tôi đã cố định riêng các chứng chỉ đó. nhưng bài đăng này hữu ích

http://groups.google.com/group/google-checkout-api-troubleshooting/browse_thread/thread/99862c11d37d3127

+3

Bạn đã tìm ra thứ tự chuỗi chứng chỉ như thế nào? – sbidwai

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