我正在使用Jersey Client库对运行在jboss上的其他服务运行测试。 我已经使用自签名证书在服务器(在本地主机上运行)上设置了https。忽略使用Jersey客户端的自签名ssl证书
然而,每当我跑我的测试与HTTPS URL我收到以下错误:
com.sun.jersey.api.client.ClientHandlerException: 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
at com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:131)
at com.sun.jersey.api.client.Client.handle(Client.java:629)
at com.sun.jersey.oauth.client.OAuthClientFilter.handle(OAuthClientFilter.java:137)
at com.sun.jersey.api.client.WebResource.handle(WebResource.java:601)
at com.sun.jersey.api.client.WebResource.access$200(WebResource.java:74)
at com.sun.jersey.api.client.WebResource$Builder.get(WebResource.java:459)
at test.helper.Helper.sendSignedRequest(Helper.java:174)
... And so on
我知道这是因为我的自签名的证书是不是在Java密钥库。有没有什么办法可以让Client
不检查ssl证书的有效性,只是不管用吗?
这段代码只能运行在测试服务器上,所以我不想在每次设置新的测试服务器时都加入新的可信任证书。
下面是其进行调用的代码:
OAuthParameters params = new OAuthParameters();
// baseline OAuth parameters for access to resource
params.signatureMethod(props.getProperty("signature_method"));
params.consumerKey(props.getProperty("consumer_key"));
params.setToken(props.getProperty("token"));
params.setVersion("1.0");
params.nonce();
// OAuth secrets to access resource
OAuthSecrets secrets = new OAuthSecrets();
secrets.consumerSecret(props.getProperty("consumer_secret"));
secrets.setTokenSecret(props.getProperty("token_secret"));
// Jersey client to make REST calls to token services
Client client = Client.create();
// OAuth test server resource
WebResource resource = client.resource(props.getProperty("url"));
// if parameters and secrets remain static, filter cab be added to each web resource
OAuthClientFilter filter = new OAuthClientFilter(client.getProviders(), params, secrets);
// filter added at the web resource level
resource.addFilter(filter);
WebResource.Builder wbr = resource.getRequestBuilder().accept(props.getProperty("accept"));
return wbr.get(ClientResponse.class);
任何帮助将不胜感激。
克里斯,你有与Java 7的兼容版本?在你的代码中,你根本没有提供KeyStore,你是否使用-D指定了一个使用SSL属性给虚拟机的密钥库? – Uri 2013-12-19 12:45:16
我没有指定KeyStore。我使用了上面的代码,没有任何其他虚拟机的争论。如果我相信代码的工作原理是因为它不检查它是否由可信签名人签名,它只会检查它是否格式正确。 – 2014-01-24 19:05:26
我不得不更换'公共X509证书[] getAcceptedIssuers(){返回null;}'和'公共X509证书[] getAcceptedIssuers(){返回新的X509证书[0];}',使其工作。 – 2014-05-19 14:04:01