Unirest (Java バージョン) を使用して GET および POST 要求を作成していますが、プログラムが企業ネットワークの背後にあり、ネットワーク管理者がファイアウォール マッピングをセットアップしているため、SSL 暗号化サイトにアクセスすると問題が発生します。たとえば、foobar.com
にマップされ56.1.89.12:4444
ます。しかし、そのアドレスにリクエストを送信すると、次の ssl 証明書エラーが表示されます。
com.mashape.unirest.http.exceptions.UnirestException: javax.net.ssl.SSLException: hostname in certificate didn't match: <56.1.89.12> != <www.foobar.com>
at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:131)
at com.mashape.unirest.request.BaseRequest.asString(BaseRequest.java:52)
Unirest
カスタムを使用するための事前設定があるようですhttpclient
。だから私は使用します
Unirest.setHttpClient(MyHttpClient.makeClient());
HttpResponse<String> res = null;
try {
res = Unirest.get(urlstr).asString();
} catch (UnirestException e) {
e.printStackTrace();
}
String jsonstr = res.getBody();
makeClient
方法MyHttpClient
は次のとおりです。
public static HttpClient makeClient(){
SSLContextBuilder builder = new SSLContextBuilder();
CloseableHttpClient httpclient = null;
try {
// builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
builder.loadTrustMaterial(null, new TrustStrategy(){
public boolean isTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
return true;
}
});
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
builder.build());
httpclient = HttpClients.custom().setSSLSocketFactory(
sslsf).build();
System.out.println("custom httpclient called");
System.out.println(httpclient);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
return httpclient;
}
主なアイデアは、Apache HttpClient 4.3 での SSL 証明書の無視から取られています。
しかし、それでもうまくいきませんでした。何か提案はありますか?