2016-01-19 3 views
7

Я пытаюсь использовать Restore ClientResource для подключения с использованием HTTPS к серверу, использующему самозаверяющий сертификат. Я эта работа с помощью автономного приложения, которое просто использует ClientResource и мой обычай SSLContextFactory добавлен как атрибут и код для его можно увидеть здесь:Как использовать пользовательский SSLContextFactory в приложении Restocket, запущенном на Jetty?

https://github.com/pixelatedpete/selfsignedexample

Когда я использую одни и те же классы (DynamicTrustManager и SelfSignSslSocketFactory) в более сложном приложении Restlet (с тем же самым pom, что и выше), который использует Restlet для предоставления API REST, обслуживаемого Jetty, мой пользовательский SSLContextFactory больше не используется.

Я добавляю его в контекст ClientResource, как указано выше, но я никогда не вижу ни одного сообщения журнала, предлагающего, чтобы SSLContextFactory, предоставленный ClientResource, передавался в базовый httpclient.

Если я перезапись с использованием HttpClient напрямую, а не 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); 

вещи работать снова.

Это что-то еще кто-то встретил и может указать, что я подозреваю, это очень очевидная вещь, которую я не хватает?

Nb. Попробовал еще раз, используя Tomcat и получить тот же вопрос

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 

пытались также инъекции SslContextFactory (мы используем Guice здесь), но это не помогло.

ответ

3

ОК, так что, наконец, понял это - я пропускал бит Клиент:

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