httpclient調用https服務端繞過證書的方法
在日常開發或者測試中,通常會遇到需要用httpclient客戶端調用對方http是服務器的場景,由于沒有證書,所以直接是無法調用的。采用下面的方法可以繞過證書驗證:
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}}};// 創建一個SSL上下文,設置信任管理器try {SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());} catch (Exception e) {e.printStackTrace();}
完整代碼:
public static String sendHttpPostRequest(String url, JSONObject param) throws Exception {TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {public java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}}};// 創建一個SSL上下文,設置信任管理器try {SSLContext sc = SSLContext.getInstance("TLS");sc.init(null, trustAllCerts, new java.security.SecureRandom());HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());} catch (Exception e) {e.printStackTrace();}URL apiUrl = new URL(url);HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();// 設置請求方法為 POSTconnection.setRequestMethod("POST");connection.setDoOutput(true);// 添加請求頭connection.setRequestProperty("Content-Type", "application/json");//connection.setRequestProperty("", accessToken);// 發送 POST 請求必須設置如下兩行OutputStream outputStream = connection.getOutputStream();OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8);outputStreamWriter.write(param.toJSONString());outputStreamWriter.flush();outputStreamWriter.close();int responseCode = connection.getResponseCode();System.out.println("Response Code: " + responseCode);// 創建一個 BufferedReader 來讀取服務器的響應BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream()));StringBuffer response = new StringBuffer();String inputLine;while ((inputLine = bufferedReader.readLine()) != null) {response.append(inputLine);}bufferedReader.close();System.out.println("Response: " + response.toString());return null;}