2016-01-19 14 views
7

Tôi đang cố gắng sử dụng ClientResource của Restlet để kết nối bằng HTTPS với máy chủ sử dụng chứng chỉ tự ký. Tôi đã này làm việc sử dụng một ứng dụng độc lập mà chỉ sử dụng ClientResource và tùy chỉnh của tôi SSLContextFactory thêm vào như là một thuộc tính và mã cho nó có thể được nhìn thấy ở đây:Làm cách nào để sử dụng SSLContextFactory tùy chỉnh trong ứng dụng Restlet chạy trên Jetty?

https://github.com/pixelatedpete/selfsignedexample

Khi tôi sử dụng các lớp học tương tự (DynamicTrustManager và SelfSignSslSocketFactory) trong một ứng dụng Restlet phức tạp hơn (với cùng pom như trên) sử dụng Restlet để cung cấp một API REST được phục vụ thông qua Jetty, SSLContextFactory tùy chỉnh của tôi không còn được sử dụng nữa.

Tôi thêm nó vào ngữ cảnh ClientResource như trên nhưng tôi không bao giờ thấy bất kỳ thông báo tường trình nào cho thấy SSLContextFactory được cung cấp cho ClientResource được chuyển xuống httpnhân cơ bản.

Nếu tôi viết lại sử dụng HttpClient trực tiếp chứ không phải là ClientResource:

HttpPost post = new HttpPost(cr.getReference().toString()); 
CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate) cf.generateCertificate(...); 
DynamicTrustManager tm = new DynamicTrustManager(..., cert); 
SelfSignTrustSslContextFactory scf = (SelfSignTrustSslContextFactory) 
CloseableHttpClient httpclient = HttpClients.custom().setSslcontext(scf.createSslContext()).build(); 
CloseableHttpResponse response = httpclient.execute(post); 

thứ hoạt động trở lại.

Đây có phải là điều mà bất kỳ ai khác đã gặp phải và có thể chỉ ra những gì tôi nghi ngờ là một điều rất rõ ràng tôi đang bỏ lỡ?

Nb. Đã thử lại bằng cách sử dụng Tomcat và gặp vấn đề tương tự

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ũng đã thử tiêm SslContextFactory (chúng tôi đang sử dụng Guice tại đây) nhưng điều đó cũng không giúp ích gì.

Trả lời

3

OK, vì vậy cuối cùng figured it out - Tôi đã thiếu chút Chủ đầu tư:

Client client = new Client(crCtx, Protocol.HTTPS); 
ClientResource clientResource = new ClientResource("https://example.com"); 
clientResource.setNext(client); 
Các vấn đề liên quan