通過 Apache Commons HttpClient 傳送 HTTPS 請求

FrankYou發表於2017-09-14

1、通過 HTTPS 傳送 POST 請求;

2、HTTPS 安全協議採用 TLSv1.2;

3、 使用代理(Proxy)進行 HTTPS 訪問;

4、指定 Content-Type 為:application/x-www-form-urlencoded;

5、HTTPS  請求時載入客戶端證照(Client Certificate);

6、忽略伺服器端證照鏈(Server Certificate Chain)的校驗(Validate)。

public static void main(String[] args) throws IOException, UnrecoverableKeyException, CertificateException, KeyStoreException, KeyManagementException {
        SSLConnectionSocketFactory socketFactory = getSocketFactory();
        
        // 建立 CloseableHttpClient 物件
        CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(socketFactory).build();
        
        // 指定請求的 URL 並建立 HttpPost 物件
        HttpPost httppost = new HttpPost("https://xxxx/yyyy");
        
        // 設定請求通過的代理
        httppost.setConfig(RequestConfig.custom().setProxy(new HttpHost("host", 8080)).build());
        HttpEntity entity;
        
        // 設定請求的 ContentType 為 application/x-www-form-urlencoded
        httppost.addHeader(HttpHeaders.CONTENT_TYPE, Consts.HTTP_REQUEST_CONTENTTYPE_FORM);
        
        // 構建 POST 的內容
        List<BasicNameValuePair> nvps = new ArrayList<>();
        nvps.add(new BasicNameValuePair("amount", "1.00"));
        entity = new UrlEncodedFormEntity(nvps, Consts.CHARSET_UTF8);
        httppost.setEntity(entity);
        CloseableHttpResponse response = null;
        try {
            // 傳送請求
            response = httpclient.execute(httppost);
            
            // 獲取響應內容
            HttpEntity entity1 = response.getEntity();
            System.out.println(EntityUtils.toString(entity1));
        } finally {
            if (null != response) {
                response.close();
            }
            if (null != httpclient) {
                httpclient.close();
            }
        }
    }

    // 忽略伺服器端證照鏈的認證
    private static TrustManager getTrustManagers() {
        return new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }

            public void checkClientTrusted(X509Certificate[] certs, String authType) {
            }

            public void checkServerTrusted(X509Certificate[] certs, String authType) {
            }
        };
    }

    private static SSLConnectionSocketFactory getSocketFactory() throws IOException, KeyStoreException, CertificateException, UnrecoverableKeyException, KeyManagementException {
        SSLContext sslContext;
        try {
            // keyStore 用來存放客戶端證照
            KeyStore keyStore = KeyStore.getInstance("PKCS12");
            FileInputStream instream = new FileInputStream(new File("d:\\test.p12"));
            try {
                keyStore.load(instream, "passwd".toCharArray());
            } finally {
                instream.close();
            }
            
            // 載入客戶端證照,並設定HTTPS的安全協議為 TLSv1.2
            sslContext = SSLContexts.custom().loadKeyMaterial(keyStore, "passwd".toCharArray()).useProtocol("TLSv1.2").build();
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
        try {
            sslContext.init(null, new TrustManager[]{getTrustManagers()}, new java.security.SecureRandom());
        } catch (KeyManagementException e) {
            return null;
        }
        return new SSLConnectionSocketFactory(sslContext);
    }

 

相關文章