如何实现无需证书直接调用HTTPS WebService接口?

2026-04-11 05:122阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计590个文字,预计阅读时间需要3分钟。

如何实现无需证书直接调用HTTPS WebService接口?

确保证书,绕过SSL验证调用HTTPS协议的Webservice接口。目录:接口说明+调用思路+案例+Axis调用+HttpClient调用+参考链接+调用HTTPS协议的Webservice接口时,若无证书验证,通常会报错‘javax.net.ssl.SSLException’。

免证书,绕过SSL验证调用Https协议的Webservice接口

目录
  • 前言
  • 思路
  • 方案
    • Axis调用
    • HttpClient调用
  • 参考链接

前言

在调用host:port/WebService?wsdl"); webservice = new WebServiceLocator().getWebServicePort(endpoint); } catch (Exception e) { e.printStackTrace(); } HttpClient调用

可以使用Httpclient作为Webservice客户端发起免征书调用,优点是兼容性更强,缺点是需要自定义封装和解析soap xml报文。

如何实现无需证书直接调用HTTPS WebService接口?

Httpclient依赖jar:httpcore-4.4.4.jar,httpclient-4.5.jar(在was中间件下需要设置共享库,否则会发生jar冲突)

  1. 获取调用报文

可以通过soapUI调试Webservice接口,获取调用时发送的soap xml格式。

  1. 创建绕过SSL验证的Httpclient客户端

/** * 在调用SSL之前需要重写验证方法,取消检测SSL * 创建ConnectionManager,添加Connection配置信息 * @return HttpClient 支持https */ private static HttpClient getHttpClient() { try { // 在调用SSL之前需要重写验证方法,取消检测SSL X509TrustManager trustManager = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] xcs, String str) { } @Override public void checkServerTrusted(X509Certificate[] xcs, String str) { } }; SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS); ctx.init(null, new TrustManager[] { trustManager }, null); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE); // 创建Registry RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).setExpectContinueEnabled(Boolean.TRUE) .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST)) .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).setConnectTimeout(connectTimeout).setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).build(); Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create() .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build(); // 创建ConnectionManager,添加Connection配置信息 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig).build(); return closeableHttpClient; } catch (KeyManagementException ex) { throw new RuntimeException(ex); } catch (NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } }

  1. 发起Webservice接口调用

public static String doPost(String url, String soapXml, String soapAction) { CloseableHttpClient httpClient = null; CloseableHttpResponse httpResponse = null; String result = ""; // 创建httpClient实例 httpClient = (CloseableHttpClient) getHttpClient(); // 创建httpPost远程连接实例 HttpPost httpPost = new HttpPost(url); // 设置请求头 httpPost.addHeader("Content-Type", "text/xml;charset=UTF-8"); httpPost.setHeader("SOAPAction", SOAPAction); httpPost.setEntity(new StringEntity(soapXml, "UTF-8")); try { // httpClient对象执行post请求,并返回响应参数对象 httpResponse = httpClient.execute(httpPost); // 从响应对象中获取响应内容 HttpEntity entity = httpResponse.getEntity(); result = EntityUtils.toString(entity); } catch (ClientProtocolException e) { e.printStackTrace(); Logger.error("发送POST请求异常:" + e.getMessage(), e); } catch (IOException e) { e.printStackTrace(); Logger.error("发送POST请求异常:" + e.getMessage(), e); } finally { // 关闭资源 if (null != httpResponse) { try { httpResponse.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != httpClient) { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; }

  1. 解析返回的result XML。此处不做详解。
参考链接

HttpClient调用WebService接口_小豆的编程世界...的博客

httpclient作为客户端调用webservice_aperise的博客

本文共计590个文字,预计阅读时间需要3分钟。

如何实现无需证书直接调用HTTPS WebService接口?

确保证书,绕过SSL验证调用HTTPS协议的Webservice接口。目录:接口说明+调用思路+案例+Axis调用+HttpClient调用+参考链接+调用HTTPS协议的Webservice接口时,若无证书验证,通常会报错‘javax.net.ssl.SSLException’。

免证书,绕过SSL验证调用Https协议的Webservice接口

目录
  • 前言
  • 思路
  • 方案
    • Axis调用
    • HttpClient调用
  • 参考链接

前言

在调用host:port/WebService?wsdl"); webservice = new WebServiceLocator().getWebServicePort(endpoint); } catch (Exception e) { e.printStackTrace(); } HttpClient调用

可以使用Httpclient作为Webservice客户端发起免征书调用,优点是兼容性更强,缺点是需要自定义封装和解析soap xml报文。

如何实现无需证书直接调用HTTPS WebService接口?

Httpclient依赖jar:httpcore-4.4.4.jar,httpclient-4.5.jar(在was中间件下需要设置共享库,否则会发生jar冲突)

  1. 获取调用报文

可以通过soapUI调试Webservice接口,获取调用时发送的soap xml格式。

  1. 创建绕过SSL验证的Httpclient客户端

/** * 在调用SSL之前需要重写验证方法,取消检测SSL * 创建ConnectionManager,添加Connection配置信息 * @return HttpClient 支持https */ private static HttpClient getHttpClient() { try { // 在调用SSL之前需要重写验证方法,取消检测SSL X509TrustManager trustManager = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkClientTrusted(X509Certificate[] xcs, String str) { } @Override public void checkServerTrusted(X509Certificate[] xcs, String str) { } }; SSLContext ctx = SSLContext.getInstance(SSLConnectionSocketFactory.TLS); ctx.init(null, new TrustManager[] { trustManager }, null); SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE); // 创建Registry RequestConfig requestConfig = RequestConfig.custom().setCookieSpec(CookieSpecs.STANDARD_STRICT).setExpectContinueEnabled(Boolean.TRUE) .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST)) .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)).setConnectTimeout(connectTimeout).setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).build(); Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create() .register("http", PlainConnectionSocketFactory.INSTANCE).register("https", socketFactory).build(); // 创建ConnectionManager,添加Connection配置信息 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry); CloseableHttpClient closeableHttpClient = HttpClients.custom().setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig).build(); return closeableHttpClient; } catch (KeyManagementException ex) { throw new RuntimeException(ex); } catch (NoSuchAlgorithmException ex) { throw new RuntimeException(ex); } }

  1. 发起Webservice接口调用

public static String doPost(String url, String soapXml, String soapAction) { CloseableHttpClient httpClient = null; CloseableHttpResponse httpResponse = null; String result = ""; // 创建httpClient实例 httpClient = (CloseableHttpClient) getHttpClient(); // 创建httpPost远程连接实例 HttpPost httpPost = new HttpPost(url); // 设置请求头 httpPost.addHeader("Content-Type", "text/xml;charset=UTF-8"); httpPost.setHeader("SOAPAction", SOAPAction); httpPost.setEntity(new StringEntity(soapXml, "UTF-8")); try { // httpClient对象执行post请求,并返回响应参数对象 httpResponse = httpClient.execute(httpPost); // 从响应对象中获取响应内容 HttpEntity entity = httpResponse.getEntity(); result = EntityUtils.toString(entity); } catch (ClientProtocolException e) { e.printStackTrace(); Logger.error("发送POST请求异常:" + e.getMessage(), e); } catch (IOException e) { e.printStackTrace(); Logger.error("发送POST请求异常:" + e.getMessage(), e); } finally { // 关闭资源 if (null != httpResponse) { try { httpResponse.close(); } catch (IOException e) { e.printStackTrace(); } } if (null != httpClient) { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; }

  1. 解析返回的result XML。此处不做详解。
参考链接

HttpClient调用WebService接口_小豆的编程世界...的博客

httpclient作为客户端调用webservice_aperise的博客