Java 如何在Jetty上运行的Restlet应用程序中使用自定义SSLContextFactory?

Java 如何在Jetty上运行的Restlet应用程序中使用自定义SSLContextFactory?,java,ssl,restlet,Java,Ssl,Restlet,我正在尝试使用Restlet的ClientResource使用HTTPS连接到使用自签名证书的服务器。我使用一个仅使用ClientResource和我的自定义SSLContextFactory作为属性的独立应用程序进行了此工作,其代码可以在此处看到: 当我在更复杂的Restlet应用程序中使用相同的类(DynamicTrustManager和SelfSignSslSocketFactory)时(使用与上面相同的pom),该应用程序使用Restlet提供通过Jetty提供的RESTAPI,我的自

我正在尝试使用Restlet的ClientResource使用HTTPS连接到使用自签名证书的服务器。我使用一个仅使用ClientResource和我的自定义SSLContextFactory作为属性的独立应用程序进行了此工作,其代码可以在此处看到:

当我在更复杂的Restlet应用程序中使用相同的类(DynamicTrustManager和SelfSignSslSocketFactory)时(使用与上面相同的pom),该应用程序使用Restlet提供通过Jetty提供的RESTAPI,我的自定义SSLContextFactory将不再被使用

我如上所述将其添加到ClientResource上下文中,但我从未看到任何日志消息表明提供给ClientResource的SSLContextFactory被传递到底层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);
事情又开始了

这是不是其他人都遇到过,并且能指出我怀疑的是我遗漏的一件非常明显的事情

注意。再次尝试使用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),但也没有任何帮助。

好的,所以最终找到了答案-我缺少了客户端位:

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