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包,问题解决,虽然问题解决了但是深入原理还是有待学习的,仅在此记录解决方案,供以后学习

    推荐阅读