HttpsURLConnection跳过SSL证书发送请求

x33g5p2x  于2021-10-17 转载在 其他  
字(3.5k)|赞(0)|评价(0)|浏览(560)

在Java的编程世界里面,我们有的时候,会经常访问一些HTTPS的网站,那么访问这些HTTPS的网站的时候,如果当前这个网站是自己企业内部的已知的网站,或者我们信任的网站,这个时候,我们为了编写程序的方便,就不需要把当前网站的服务器的根证书以及中间证书导入到JKS里面,让在程序在调用HTTP协议的时候对服务器的服务器名和证书名进行对比

解决办法: 跳过SSL证书,将下面部分代码添加到你的类或者方法中就能跳过证书了

  1. import javax.net.ssl.HostnameVerifier;
  2. import javax.net.ssl.HttpsURLConnection;
  3. import javax.net.ssl.SSLSession;
  4. import java.io.BufferedReader;
  5. import java.io.InputStreamReader;
  6. import java.net.HttpURLConnection;
  7. import java.net.URL;
  8. import java.net.URLEncoder;
  9. import java.util.Map;
  10. public class HttpUtils {
  11. // 忽略整个类SSL证书请求
  12. // static {
  13. // try {
  14. // trustAllHttpsCertificates();
  15. // HttpsURLConnection.setDefaultHostnameVerifier
  16. // (
  17. // (urlHostName, session) -> true
  18. // );
  19. // } catch (Exception e) {
  20. // }
  21. // }
  22. public static String doGet(String mainUrl, String sysID, String pKey, Map<String, String> params) throws Exception {
  23. StringBuffer queryString = new StringBuffer();
  24. String utf8 = "UTF-8";
  25. String random = URLEncoder.encode(java.util.UUID.randomUUID().toString(), utf8);
  26. String code = URLEncoder.encode(pKey+ random, utf8);
  27. queryString.append("Random=");
  28. queryString.append(random);
  29. queryString.append("&");
  30. queryString.append("Code=");
  31. queryString.append(code);
  32. queryString.append("&");
  33. queryString.append("SysID=");
  34. queryString.append(sysID);
  35. queryString.append("&");
  36. for (Map.Entry<String, String> entry : params.entrySet()) {
  37. queryString.append(entry.getKey());
  38. queryString.append("=");
  39. queryString.append(URLEncoder.encode(entry.getValue(), utf8));
  40. queryString.append("&");
  41. }
  42. String query = queryString.toString();
  43. query = query.substring(0, query.length() - 1);
  44. String url = mainUrl + "?" + query;
  45. System.out.println(url);
  46. URL serverUrl = new URL(url);
  47. //-----忽略这个请求相关证书。
  48. trustAllHttpsCertificates();
  49. HostnameVerifier hv = new HostnameVerifier() {
  50. @Override
  51. public boolean verify(String urlHostName, SSLSession session) {
  52. System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
  53. return true;
  54. }
  55. };
  56. HttpsURLConnection.setDefaultHostnameVerifier(hv);
  57. //-------
  58. HttpURLConnection connection = (HttpURLConnection) serverUrl.openConnection();
  59. connection.setRequestMethod("GET");
  60. if (connection.getResponseCode() != 200) {
  61. throw new RuntimeException("HTTP GET Request Failed with Error code : " + connection.getResponseCode());
  62. }
  63. BufferedReader responseBuffer = new BufferedReader(new InputStreamReader((connection.getInputStream())));
  64. String output;
  65. String result = "";
  66. while ((output = responseBuffer.readLine()) != null) {
  67. result += output;
  68. }
  69. connection.disconnect();
  70. return result;
  71. }
  72. private static void trustAllHttpsCertificates() throws Exception {
  73. javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
  74. javax.net.ssl.TrustManager tm = new miTM();
  75. trustAllCerts[0] = tm;
  76. javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext.getInstance("SSL");
  77. sc.init(null, trustAllCerts, null);
  78. javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
  79. }
  80. static class miTM implements javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager {
  81. @Override
  82. public java.security.cert.X509Certificate[] getAcceptedIssuers() {
  83. return null;
  84. }
  85. public boolean isServerTrusted(java.security.cert.X509Certificate[] certs) {
  86. return true;
  87. }
  88. public boolean isClientTrusted(java.security.cert.X509Certificate[] certs) {
  89. return true;
  90. }
  91. @Override
  92. public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
  93. throws java.security.cert.CertificateException {
  94. return;
  95. }
  96. @Override
  97. public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
  98. throws java.security.cert.CertificateException {
  99. return;
  100. }
  101. }
  102. }

相关文章