java HttpURLConnection调用https接口报错 No subject alternative names matching IP address xxxx found
·
报错信息,原因是接口只能https协议访问,但是https的证书浏览器访问也提示不可信,HttpURLConnection调用就报错了
No subject alternative names matching IP address xxxx found

解决方法:首先找到HostnameChecker.java的源码,覆盖重写 去验证去掉这个万能方法应该是可以的,不过HttpURLConnection 已经提供了api(setDefaultHostnameVerifier)去重写验证,而且HostnameChecker是jdk 的类,不是普通的jar,项目上jdk版本会有变化,所以jdk的jar最好不要重写覆盖方式,项目的lib下的jar重写覆盖不用考虑这个版本问题

使用HttpURLConnection 提供了api (setDefaultHostnameVerifier)去掉验证

HttpsURLConnection调用部分代码记录
ByteArrayOutputStream byteArrayOutputStream = null;
InputStream inputStream=null;
try {
byte[] data2 = new byte[1024 * 8];
// 创建URL
URL url = new URL(pdfAdrr);
HostnameVerifier hv = new HostnameVerifier() {
@Override
public boolean verify(String urlHostName, SSLSession session) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(hv);
// 创建链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(10 * 1000);
if (conn.getResponseCode() != HttpURLConnection.HTTP_OK) {
//连接失败/链接失效/文件不存在
StringBuffer sb = new StringBuffer();
sb.append("<response><code>200</code><message>获取pdf报告失败!</message><datainfos>");
sb.append("调用pdf生成方法失败,文件不存在pdfAdrr:"+pdfAdrr);
sb.append("</datainfos></response>");
return sb.toString();
}
inputStream = conn.getInputStream();
byteArrayOutputStream = new ByteArrayOutputStream();
int len = -1;
while (-1 != (len = inputStream.read(data2))) {
byteArrayOutputStream.write(data2, 0, len);
}
StringBuffer sb = new StringBuffer();
sb.append("<response><code>200</code><message>获取pdf报告成功!</message><datainfos>");
sb.append("<![CDATA[" + Base64.byteArrayToBase64(byteArrayOutputStream.toByteArray()) + "]]>");
sb.append("</datainfos></response>");
return sb.toString();
} finally {
if(byteArrayOutputStream!=null){
byteArrayOutputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
}
更多推荐
所有评论(0)