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());

编译之后把源码重新编译后打成jar包替换原来的jar包,问题解决,虽然问题解决了但是深入原理还是有待学习的,仅在此记录解决方案,供以后学习

你可能感兴趣的:(个人成长)