使用OKHTTP调用HTTPS接口时,报错/异常信息:
Hostname * not verified:
certificate: sha256/F0yVXJ/nbG7JtrM+11NhtuKkepfbtzvXufVCUQ5Gxm4=
DN: CN=*.xxx.com, O=*有限公司, L=北京市, ST=北京市, C=CN
subjectAltNames: [*.xxx.com, xxx.com]文章来源:https://www.toymoban.com/news/detail-636244.html
处理方式如下:文章来源地址https://www.toymoban.com/news/detail-636244.html
/**
* 发送POST请求,调用HTTP接口
* @param url 接口地址
* @param params 接口参数(JSon格式)
* @return JSon
*
*/
public static String post(String url, String params) throws Exception {
String json = null;
if(params == null) params = "";
TrustManagerFactory trustManagerFactory = null;
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{trustManager}, null);
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(70, TimeUnit.SECONDS).sslSocketFactory(create(), trustManager).hostnameVerifier(trusts()).build();
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, params);
Request.Builder builder = new Request.Builder();
builder.url(url); //接口地址
builder.method("POST", body);
builder.addHeader("Content-Type", "application/json");
Request request = builder.build();
Response response = client.newCall(request).execute();
ResponseBody responseBody = response.body();
if (response.isSuccessful() && responseBody != null) {
json = responseBody.string();
} else {
if(responseBody != null) json = responseBody.string();
}
return json;
}
/**
* 处理SSL协议(添加信任域名)
*/
private static HostnameVerifier trusts() {
return new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
HostnameVerifier verifier = HttpsURLConnection.getDefaultHostnameVerifier();
return verifier.verify("*.xxx.com", session);
}
};
}
/**
* 创建SSLSocketFactory
* @return SSLSocketFactory
*/
private static SSLSocketFactory create() {
SSLSocketFactory sslFactory = null;
try {
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, new TrustManager[]{new Verifier()}, new SecureRandom());
sslFactory = ctx.getSocketFactory();
} catch (Exception e) {
e.printStackTrace();
}
return sslFactory;
}
到了这里,关于Hostname * not verified:certificate,HTTPS接口调用处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!