今天在做学习cas时 在登录cas时没有问题,一旦登录之后返回的时候就报了如下错误: javax.servlet.ServletException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present 
edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:254) 
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:184) 
javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative names present 
com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1649) 
com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241) 
com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235) 
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206) 
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136) 
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149) 
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1177) 
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234) 
edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:70) 
edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:212) 
edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:219) 
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:184) java.security.cert.CertificateException: No subject alternative names present 
sun.security.util.HostnameChecker.matchIP(HostnameChecker.java:142) 
sun.security.util.HostnameChecker.match(HostnameChecker.java:75) 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:264) 
com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:250) 
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185) 
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136) 
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165) 
com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149) 
sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1177) 
sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:234) 
edu.yale.its.tp.cas.util.SecureURL.retrieve(SecureURL.java:70) 
edu.yale.its.tp.cas.client.ServiceTicketValidator.validate(ServiceTicketValidator.java:212) 
edu.yale.its.tp.cas.client.filter.CASFilter.getAuthenticatedUser(CASFilter.java:219) 
edu.yale.its.tp.cas.client.filter.CASFilter.doFilter(CASFilter.java:184) 请赐教,到底是哪错了。 另外:在配置tomcat的https时。访问https://127.0.0.1:8443 
IE总是报证书错误。不知道是不是与这有关 

解决方案 »

  1.   

    证书错, 是你证书没导正确,  
    java.security.cert.CertificateException: No subject alternative names present
    这个我也不知道为啥,你知道了告诉兄弟一下。 谢谢
      

  2.   

    我用的是服务器自己证书   
     System.setProperty( "javax.net.ssl.trustStore","c:/tomcat6/server.keystore"); 
     System.setProperty( "javax.net.ssl.trustStorePassword","changeit");
    执行前加入该值,就报这样的错
      

  3.   

    URL为IP时,默认是通不过验证的,需要自己定义HostName的验证方法:在调用webservice之前,加如下代码就可以解决了
     HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                System.out.println("Warning: URL Host: " + urlHostName + " vs. "
                                   + session.getPeerHost());
                return true;
            }
        };
    HttpsURLConnection.setDefaultHostnameVerifier(hv);