【发布时间】:2015-02-21 17:42:46
【问题描述】:
我正在尝试使用 SSL URL 发布服务调用。我遇到了一个例外。
javax.ws.rs.ProcessingException: 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 org.glassfish.jersey.apache.connector.ApacheConnector.apply(ApacheConnector.java:517)
at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:246)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:667)
at org.glassfish.jersey.client.JerseyInvocation$1.call(JerseyInvocation.java:664)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315).
我正在使用 Spring,Jersey 并尝试使用 ApacheClient(使用原因,在 Weblogic 上它使用 Weblogic 特定的 HTTP 处理程序,我知道我们可以使用“DUseSunHttpHandler=true”,但我不想在生产中这样做)。
请注意,只有 Jersey 实现它可以在 Tomcat 和 Weblogic 上使用 http。但是使用 HTTPS,它在 Tomcat 中而不是在 Weblogic 中工作。所以去了 ApacheConnectionProvider,从那里它也不能在 Tomcat 中工作。
POM 条目
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.15</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-common</artifactId>
<version>2.15</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.4</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.connectors</groupId>
<artifactId>jersey-apache-connector</artifactId>
<version>2.15</version>
</dependency>
代码
public Client getClient() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.property(ApacheClientProperties.CONNECTION_MANAGER, new PoolingHttpClientConnectionManager());
//config your ssl for apache connector
SslConfigurator sslConfig = SslConfigurator.newInstance();
String trustStoreFile = "C:\\Development\\svn\\ecomm-webapp\\profiles\\uat\\workflowtrust.jks";
String trustStorePassword ="ABC12";
String keyStoreFile = "C:\\Development\\svn\\ecomm-webapp\\profiles\\uat\\workflow.jks";
String keyPassword ="abc12";
sslConfig.trustStoreFile(trustStoreFile).keyStoreFile(keyStoreFile).keyStorePassword(trustStorePassword).trustStorePassword(trustStorePassword).securityProtocol("SSL");
clientConfig.property(ApacheClientProperties.SSL_CONFIG, sslConfig);
ApacheConnectorProvider connector = new ApacheConnectorProvider();
clientConfig.connectorProvider(connector);
return ClientBuilder.newClient(clientConfig);
}
调用代码
public <T> T postXmlFile(final File inputXml, final String targetUrl, Class<T> resultResponse, final RestfulServiceVerifier<T> restfulServiceVerifier) throws FunctionalException {
return post(MediaType.APPLICATION_XML_TYPE, MediaType.TEXT_XML_TYPE, inputXml, targetUrl, resultResponse, restfulServiceVerifier);
}
private <T> T post(final MediaType type, final MediaType accept, final Object entity, final String targetUrl, Class<T> resultResponse, final RestfulServiceVerifier<T> restfulServiceVerifier) throws FunctionalException {
Response response = null;
int responseStatus = -1;
T result = null;
while (restfulServiceVerifier.hasNextWorkFlowHit()) {
try {
response = restFulWebTargetFactory.getClient().target(targetUrl)
.request(type)
.post(Entity.entity(entity, accept));
responseStatus = response.getStatus();
if(EcommConstants.WORKFLOW_ORDER_PROPOSAL_SUCCESS_CODE == responseStatus) {
final String resultInString = response.readEntity(String.class);
//for audit purpose
if (LOG_XML_MESSAGE) {
log.info("XML Response "+ resultInString);
}
result = unMarshalXML(resultInString, resultResponse);
restfulServiceVerifier.checkResponse(result, responseStatus);
}
} catch (WorkFlowRetryException workFlowException) {
throw new FunctionalException("WebService post failed. ", workFlowException);
}catch (WorkFlowValidationException workFlowValidationException) {
log.error("Service Response Validation Exception " + workFlowValidationException.getErrorCode() + " Error Description " + workFlowValidationException.getDescription(), workFlowValidationException);
}catch (final Exception e) {
log.error("Exception occurred" , e);
} finally {
if(null != response) {
response.close();
}
}
}
if(-1 == responseStatus) {
throw new FunctionalException("WebService post failed. ", new Exception());
}
return result;
}
【问题讨论】:
标签: spring apache rest ssl jersey-2.0