项目需要访问https请求但是一直报错No subject alternative names matching IP address XXX found.
随查找各种API,原来https是双向握手,必须指定主机HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
// conn.setHostnameVerifier(DO_NOT_VERIFY);
URL url = new URL(
"https://127.0.0.1/test");
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
System.out.println(hostname);
System.out.println(session.getPeerHost() + ":"
+ session.getPeerPort());
if (hostname.equals("127.0.0.1")) {
return true;
} else {
return false;
}
}
};
代码中必须对指定主机地址过滤,否则面临很不安全的局面,这里我采用过滤掉我要访问的连接地址IP,返回true即可过滤掉正确的https请求。
附API
public interfaceHostnameVerifier
此类是用于主机名验证的基接口。
在握手期间,如果 URL 的主机名和服务器的标识主机名不匹配,则验证机制可以回调此接口的实现程序来确定是否应该允许此连接。
策略可以是基于证书的或依赖于其他身份验证方案。
当验证 URL 主机名使用的默认规则失败时使用这些回调。
从以下版本开始:
1.4
方法摘要
booleanStringhostname, SSLSessionsession)
验证主机名和服务器身份验证方案的匹配是可接受的。
方法详细信息
verify
booleanverify(Stringhostname,SSLSessionsession)
验证主机名和服务器身份验证方案的匹配是可接受的。
参数:
hostname - 主机名
session - 到主机的连接上使用的 SSLSession
返回:
如果主机名是可接受的,则返回 true