2016-01-19 17 views
7

Sto provando a utilizzare ClientResource di Restlet per connettersi tramite HTTPS a un server che utilizza un certificato autofirmato. Ho questo lavoro utilizzando un'applicazione stand-alone che utilizza solo ClientResource e mia abitudine SSLContextFactory aggiunto come un attributo e codice per esso può essere visto qui:Come utilizzare un SSLContextFactory personalizzato in un'applicazione Restlet in esecuzione su Jetty?

https://github.com/pixelatedpete/selfsignedexample

Quando uso le stesse classi (DynamicTrustManager e SelfSignSslSocketFactory) in un'applicazione di Restlet più complessa (con lo stesso pom di cui sopra) che utilizza Restlet per fornire un'API REST servita tramite Jetty, il mio SSLContextFactory personalizzato non viene più utilizzato.

Aggiungo al contesto ClientResource come sopra ma non vedo mai nessuno dei messaggi di registro che suggeriscono che SSLContextFactory fornito a ClientResource viene passato al sottostante httpclient.

Se riscrivo utilizzando HttpClient direttamente piuttosto che 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); 

ha ripreso a funzionare.

E 'qualcosa che qualcun altro ha trovato e può indicare quello che sospetto sia una cosa molto ovvia che mi manca?

Nb. Provato di nuovo con Tomcat e ottenere lo stesso problema

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 

provato anche iniettare lo SslContextFactory (stiamo usando Guice qui), ma che non ha aiutato neanche.

risposta

3

OK, così finalmente capito tutto - mi mancava il bit Cliente:

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