2015-05-01 9 views
0

У меня есть набор тестов интеграции для API www.billiving.com. когда эта конечная точка вызова API должна быть https://www.billiving.com.Не найдено альтернативного DNS-имени, соответствующего www.billiving.com. Почему это вызвало и как решить?

мой тестовый комплект отлично работает на окнах. однако, когда он переходит на ubuntu 14.x, он выходит из строя со следующим исключением. [1]

поэтому я написал этот [2] код, чтобы проверить его за пределами набора тестов. тем не менее он терпит неудачу с тем же исключением.

поэтому я попытался импортировать сертификат billiving.com в JKS, но все же он не работает с тем же исключением.

Я знаю как решение, мы можем переопределить метод проверки в классе Verifier и вернуть его как true. но мне нужно правильное решение, так как это может привести к проблемам безопасности.

1) почему эта ошибка и почему ее только на linux.

2) как мы можем решить эту проблему с правильным раствором

API URL: https://www.billiving.com/

[1] Исключение:

>  javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: No subject alternative DNS 
> name matching www.billiving.com found. at 
> com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) 
> at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1747) 
> at 
> com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241) 
> at 
> com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235) 
> at 
> com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1209) 
> at 
> com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:135) 
> at 
> com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593) 
> at 
> com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529) 
> at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:943) 
> at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1188) 
> at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1215) 
> at 
> com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1199) 
> at 
> sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:434) 
> at 
> sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166) 
> at 
> sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195) 
> at 
> java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379) 
> at 
> sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318) 
> at Application.main(Application.java:20) Caused by: 
> java.security.cert.CertificateException: No subject alternative DNS 
> name matching www.billiving.com found. at 
> sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:193) 
> at sun.security.util.HostnameChecker.match(HostnameChecker.java:77) 
> at 
> com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:264) 
> at 
> com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:250) 
> at 
> com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1188) 

[2] пример кода:

import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class Application { 

    public static void main(String[] args) { 

     URL url; 
     try { 
      url = new URL(args[0]); 

     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setInstanceFollowRedirects(false); 
     connection.setRequestMethod("GET"); 

     if (connection.getResponseCode() >= 400) { 
      System.out.println("ERROR "+ connection.getResponseCode()); 
     } else { 
      System.out.println("Success"); 
     } 

     System.out.println("Connection Crated"); 



     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 


} 

команда для использования выше кода:

java Application https://www.billiving.com 

ответ

1

Настоящий сертификат этого сайта имеет правильное имя хоста. Но вы получаете этот сертификат только в том случае, если вы используете SNI (Server Name Indication). Старые версии Java не поддерживают SNI (должны поддерживаться с Java 7), поэтому, возможно, вам нужно обновить неуказанную версию.

+0

было здорово позвонить. да это сработало. это было в java 6, и когда я обновился до java 7, это сработало для меня. спасибо за время :) –