2011-10-07 34 views
7

Tôi đang cố gắng lấy thư viện Apache Commons HttpClient (phiên bản 3.1) để bỏ qua thực tế là chứng chỉ máy chủ không thể được thiết lập là đáng tin cậy (được chứng minh bằng ngoại lệ được ném javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target).Cách đặt Apache Commons HttpClient 3.1 bỏ qua mức độ không hợp lệ của chứng chỉ HTTPS?

tôi đã tìm Make a connection to a HTTPS server from Java and ignore the validity of the security certificate cũng như Disable Certificate Validation in Java SSL Connections, nhưng câu trả lời chấp nhận đầu tiên là dành cho HttpClient 4,0 (tiếc là tôi không thể nâng cấp, trừ ai đó có thể chỉ cho tôi đi theo hướng làm thế nào để sử dụng hai phiên bản khác nhau của cùng một trong cùng một dự án), mặc dù nó có another answer with little more than a dead link that supposedly went to a 3.x solution. Mã ở trang thứ hai dường như không có tác dụng gì cả khi tôi sử dụng phiên bản điều chỉnh một chút (về cơ bản, khai báo các lớp theo kiểu cũ hơn là sử dụng các lớp ẩn danh, cũng như áp dụng cho TLS ngoài SSL, sử dụng SSL cho nhà máy sản xuất ổ cắm HTTPS mặc định như được thực hiện trong mã ví dụ).

Tốt, tôi muốn một cái gì đó là thread-/Ví dụ toàn, do đó bất kỳ HttpClient dụ (và/hoặc các lớp học liên quan) được tạo ra từ bên trong mã servlet tôi (không servlet khác chạy trong cùng một vùng chứa) sẽ sử dụng logic xác thực chứng chỉ lax, nhưng tại thời điểm này tôi bắt đầu cảm thấy như mọi thứ sẽ làm miễn là nó chấp nhận chứng chỉ tự ký là hợp lệ.

Có, tôi biết rằng có những tác động bảo mật, nhưng lý do duy nhất tại sao tôi cần điều này là dành cho mục đích thử nghiệm. Ý tưởng là triển khai tùy chọn cấu hình để kiểm soát các chứng chỉ không tin cậy thông thường có đáng tin cậy hay không và để nó trong "không tin tưởng các chứng chỉ máy chủ không đáng tin cậy" làm mặc định. Bằng cách đó nó có thể dễ dàng được bật hoặc tắt trong phát triển, nhưng làm nó trong sản xuất sẽ yêu cầu đi ra khỏi con đường của một người.

Trả lời

11

Để chấp nhận chứng chỉ tự ký, chúng tôi sử dụng mã sau cho một số HttpConnection cụ thể từ ứng dụng khách http commons.

HttpConnection con = new HttpConnection(host, port); 
con.setProtocol(new Protocol("easyhttps", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), port)); 

Có thể tìm thấy EasySSLProtocolSocketFactory trong gói ssl contrib. Và điều này có thể được sử dụng để chỉ thực hiện các kết nối đơn lẻ với cài đặt bảo mật giảm. Nó có vẻ như điều này cũng có thể được sử dụng để thiết lập các giao thức cho mỗi khách hàng như ở đây:

Protocol easyhttps = new Protocol("https", (ProtocolSocketFactory)new EasySSLProtocolSocketFactory(), 443); 
Protocol.registerProtocol("https", easyhttps); 

HttpClient client = new HttpClient(); 
GetMethod httpget = new GetMethod("https://localhost/"); 
client.executeMethod(httpget); 

Nhưng tôi nghĩ rằng cũng sẽ ảnh hưởng đến các kết nối từ servlets khác.

[Chỉnh sửa] Rất tiếc, tôi không biết điều này có hiệu quả với bạn hay không. Chỉ cần nhận ra rằng chúng tôi đang sử dụng client 3.0.1 chứ không phải 3.1.

+0

Có, 3.1 đã ngừng sử dụng hàm tạo Giao thức mà bạn minh họa và không có phương thức HttpConnection # setProtocol nào rõ ràng. Đáng tiếc, nó trông có vẻ đầy hứa hẹn. :( –

+0

Constructor cũng không được chấp nhận trong 3.0.1;) Theo kho lưu trữ nguồn apache 'HttpConnection' vẫn có phương thức' setProtocol' trong 3.1: http://svn.apache.org/viewvc/httpcomponents/oac.hc3x /tags/HTTPCLIENT_3_1/src/java/org/apache/commons/httpclient/HttpConnection.java?view=markup – Gandalf

+0

Nhà máy có thể được truyền tới 'ProtocolSocketFactory', đây chỉ là một upcast và do đó không cần thiết nếu chúng loại bỏ hàm tạo không được chấp nhận , sau đó nó sử dụng các contructor không được chấp nhận bây giờ, tôi sẽ cập nhật bài viết của tôi. – Gandalf

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