java.security.cert.CertificateException: No subject alternative names present
记一次单点登录https中证书无效的问题:
背景环境:单点登录(cas)使用tomcat私有证书,即https;被集成的系统使用http;
百度了一堆,大概原理就是说:
在开发设计中当我们在java中打开一个SSL连接(比如:java.net.URL.openConnection(“https://….”)), JSSE实现的SSL协议执行一些验证以确保这个请求的主机不是假的。 这包括用PKIX算法验证服务器的X.509证书和检查主机名称与证书中的subject是否一致。 如果SSL证书不可信或与目标主机不匹配,HTTPS和SSL加密连接就不能建立并且抛出SSLHandshakeException 或 IOException。
公司大佬也是说单点登录的包里面如果是https请求会有验证证书的算法,所以就只能去找到源码的请求处理方法,默认不验证证书或者直接让证书通过。最终锁定在了(使用的cas-client-core-3.2.2.jar)java-cas-client-cas-client-3.2.2\cas-client-core\src\main\java\org\jasig\cas\client\util\CommonUtils.java中,糅合了n多博客,在代码中加了如下代码
static TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}public X509Certificate[] getAcceptedIssuers() {
return null;
}
} };
之后在源码的getResponseFromServer方法try代码块中添加了以下代码
SSLContext sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, trustAllCerts, new SecureRandom());
HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() {
public boolean verify(String s, SSLSession sslsession) {
return true;
}
};
HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier);
HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory());
【java.security.cert.CertificateException: No subject alternative names present】编译之后把源码重新编译后打成jar包替换原来的jar包,问题解决,虽然问题解决了但是深入原理还是有待学习的,仅在此记录解决方案,供以后学习
推荐阅读
- java.security.cert.CertificateException: No name matching IP found
- Caused by: java.security.cert.CertificateException: No subject alternative names present