但某些狀況下,伺服器使用自我認證等等的方式時,會想要略過這些認證檢查(把 HTTPS 當成 HTTP 在使用...XD)
在 Apache HttpClient 4.3 當中可以用以下的方式取得 HTTPS 的連線。
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.conn.ssl.X509HostnameVerifier;
public static CloseableHttpClient getHttpClient() {
SSLContextBuilder builder = new SSLContextBuilder();
try {
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf =
new SSLConnectionSocketFactory(builder.build(), new X509HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) { return true; }
@Override
public void verify(String arg0, SSLSocket arg1) throws IOException {}
@Override
public void verify(String arg0, X509Certificate arg1) throws SSLException {}
@Override
public void verify(String arg0, String[] arg1, String[] arg2) throws SSLException {}
});
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (NoSuchAlgorithmException | KeyStoreException | KeyManagementException e) {
e.printStackTrace();
throw new RuntimeException();
}
}
其中 5~6 行在某些狀況下應該可以直接用以下的方式:
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build());只是我的測試環境中,似乎有 host name 無法正確驗證的問題,因此就加上了 20-29 行的程式碼,讓它一律不檢查 host name。
透過上面的 getHttpClient() 的方法取得 CloseableHttpClient 這個 HttpClient 後
就可以依照一般的方法進行 HTTPS 的連線了。
參考資料:
1、Ignoring SSL certificate in Apache HttpClient 4.3
沒有留言:
張貼留言