2016-01-19 11 views
7

Ich versuche, ClientResource von Restlet zu verwenden, um mithilfe von HTTPS eine Verbindung zu einem Server herzustellen, der ein selbstsigniertes Zertifikat verwendet. Ich habe diese Arbeit eine eigenständige Anwendung, die nur verwendet ClientResource und meine benutzerdefinierte SSLContextFactory als Attribut und Code hinzugefügt, um es hier zu sehen ist:Wie verwende ich eine benutzerdefinierte SSLContextFactory in einer Restlet-Anwendung, die auf Jetty ausgeführt wird?

https://github.com/pixelatedpete/selfsignedexample

Wenn ich die gleichen Klassen (DynamicTrustManager und SelfSignSslSocketFactory) in einer komplexeren Restlet-Anwendung (mit der gleichen Pom wie oben), die Restlet verwendet, um eine REST-API bereitzustellen, die über Jetty bedient wird, wird meine benutzerdefinierte SSLContextFactory nicht mehr verwendet.

Ich füge es dem ClientResource-Kontext wie oben hinzu, aber ich sehe nie eine der Protokollmeldungen, die darauf hindeuten, dass die für ClientResource bereitgestellte SSLContextFactory an den zugrunde liegenden httpclient übergeben wird.

Wenn ich Httpclient neu schreiben mit direkt anstatt 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); 

Dinge funktionieren wieder.

Ist das etwas, auf das irgendjemand sonst gestoßen ist und was ich vermute, ist eine sehr offensichtliche Sache, die ich vermisse?

Nb. Versuchte wieder Tomcat verwenden und erhalten die gleiche Ausgabe

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 

Auch die SslContextFactory versucht Injektion (wir verwenden Guice hier), aber das hat auch nicht geholfen.

Antwort

3

OK, so dachte sie schließlich heraus - ich die Client-Bit fehlte:

Client client = new Client(crCtx, Protocol.HTTPS); 
ClientResource clientResource = new ClientResource("https://example.com"); 
clientResource.setNext(client);