java.security.cert.CertificateException: No subject alternative DNS name matching XXX found解决方案

约定不等于承诺〃 2023-02-10 05:07 404阅读 0赞

生产中遇到了一个问题:由于第三方服务商更新服务器证书,导致向其推送数据出现SSL证书认证失败。网上搜了一堆,都无法生效,最终找到了一个完美解决方案:
在代码层跳出SSL验证!

1、观察异常日志信息如下:

在这里插入图片描述

2、新增跳过证书的类,TrustAllTrustManager.java代码如下

  1. public class TrustAllTrustManager implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
  2. @Override
  3. public java.security.cert.X509Certificate[] getAcceptedIssuers() {
  4. return null;
  5. }
  6. @Override
  7. public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
  8. throws java.security.cert.CertificateException {
  9. return;
  10. }
  11. @Override
  12. public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
  13. throws java.security.cert.CertificateException {
  14. return;
  15. }
  16. }

3、在自己的发送controller中添加如下代码

  1. // 直接通过主机认证
  2. HostnameVerifier hv = new HostnameVerifier() {
  3. @Override
  4. public boolean verify(String urlHostName, SSLSession session) {
  5. return true;
  6. }
  7. };
  8. // 配置认证管理器
  9. javax.net.ssl.TrustManager[] trustAllCerts = { new TrustAllTrustManager()};
  10. SSLContext sc = SSLContext.getInstance("SSL");
  11. SSLSessionContext sslsc = sc.getServerSessionContext();
  12. sslsc.setSessionTimeout(0);
  13. sc.init(null, trustAllCerts, null);
  14. HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  15. // 激活主机认证
  16. HttpsURLConnection.setDefaultHostnameVerifier(hv);
  17. URL url = new URL(url);
  18. HttpURLConnection connection = (HttpURLConnection)url.openConnection();

4:比如我的调用第三方接口类如下:

  1. //XXX接口(出库备料)
  2. @RequestMapping("/PostMidStoreOut")
  3. @ResponseBody
  4. public Map<String, Object> PostMidStoreOut(String sb){
  5. Map<String, Object> map = new HashMap<String, Object>();
  6. try {
  7. // 直接通过主机认证
  8. HostnameVerifier hv = new HostnameVerifier() {
  9. @Override
  10. public boolean verify(String urlHostName, SSLSession session) {
  11. return true;
  12. }
  13. };
  14. TrustManager[] trustAllCerts = { new TrustAllTrustManager()};
  15. SSLContext sc = SSLContext.getInstance("SSL");
  16. SSLSessionContext sslsc = sc.getServerSessionContext();
  17. sslsc.setSessionTimeout(0);
  18. sc.init(null, trustAllCerts, null);
  19. HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  20. // 地址
  21. URL url = new URL(config.getWms()+"/XXXX/XXXX");
  22. // 调用的方法
  23. String soapActionString = "PostMidStoreOut";
  24. // 激活主机认证
  25. HttpsURLConnection.setDefaultHostnameVerifier(hv);
  26. // 打开链接
  27. HttpURLConnection con = (HttpURLConnection) url.openConnection();
  28. String xmlStr = sb.toString();
  29. con.setRequestMethod("POST");
  30. con.setRequestProperty("content-type", "text/xml; charset=utf-8");
  31. con.setRequestProperty("Content-Length", String.valueOf(xmlStr.getBytes().length));
  32. con.setRequestProperty("soapActionString", soapActionString);
  33. // post请求需要设置
  34. con.setDoOutput(true);
  35. con.setDoInput(true);
  36. // 对请求body 往里写xml 设置请求参数
  37. OutputStream ops = con.getOutputStream();
  38. ops.write(xmlStr.getBytes());
  39. ops.flush();
  40. ops.close();
  41. // 设置响应回来的信息
  42. if (con.getResponseCode() == 200) {
  43. InputStream ips = con.getInputStream();
  44. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  45. byte[] buf = new byte[1024];
  46. int length = 0;
  47. while ((length = ips.read(buf)) != -1) {
  48. baos.write(buf, 0, length);
  49. baos.flush();
  50. }
  51. byte[] responsData = baos.toByteArray();
  52. baos.close();
  53. // 处理写响应信息
  54. String responsMess = new String(responsData, "utf-8");
  55. map.put("result", true);
  56. map.put("status", 0);
  57. map.put("responsMess", responsMess);
  58. } else {
  59. map.put("status", 1);
  60. map.put("result", false);
  61. map.put("Msg", "传输数据错误");
  62. map.put("ResponseMessage", con.getResponseMessage());
  63. }
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. map.put("status", 1);
  67. map.put("Msg", "传输数据错误");
  68. map.put("result", false);
  69. }
  70. return map;
  71. }

发表评论

表情:
评论列表 (有 0 条评论,404人围观)

还没有评论,来说两句吧...

相关阅读