2015-05-15 5 views
1

Я пытаюсь использовать SOAPConnection позвонить по протоколу HTTPS, и я уже указывают на KeyStore и доверенных следующим образом:allowUnsafeRenegotiation, но до сих пор CertificateException

System.setProperty("javax.net.ssl.keyStore", "C:/kei/tasks/MIP/Cert/ccc_acp.keystore"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "password"); 
    System.setProperty("javax.net.ssl.trustStore", "C:/kei/tasks/MIP/Cert/trusteaistore.keystore"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "password"); 
    System.setProperty("javax.net.debug", "all"); 

, но я все еще получаю

javax.net .ssl.SSLHandshakeException: java.security.cert.Certificate Исключение: нет существующих альтернативных имен

Я google и найдите следующий временный зол социологическое загрязнение

System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true"); 

, но даже я установил allowUnsafeRenegotation истинно, я все еще получаю

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Нет Subject Alternative Names настоящие

И я пытаюсь использовать SOAPUI 5.1.3, и в предпочтении> ssl, я устанавливаю хранилище ключей и пароль хранилища ключей (но не место для установки доверия), на этот раз я могу подключиться к целевому серверу через https!

так

1) почему SoapUI 5.1.3 не нужно устанавливать (но доверенных сертификатов только хранилище ключей), но все еще может подключиться к HTTPS-сервер?

2) зачем использовать системное свойство для указания того же хранилища ключей, но я не могу подключиться к серверу https с помощью SOAPConnection?

3) почему я установил свойство allowUnsafeRenegotitation в true, но, похоже, он все еще проверяет публичный сертификат. сервера https и вернуть CertificateException?

***************** редактировать на 15/5/2015

Я разместить код здесь

public static void main(String args[]){ 
    System.setProperty("javax.net.ssl.keyStore", "C:/kei/tasks/MIP/Cert/ccc_acp.keystore"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "password"); 
    MipCccSoapTest mipCccSoapTest = new MipCccSoapTest(); 
    mipCccSoapTest.testHttpConnection();   
} 

private void testHttpConnection(){ 
    try{ 
     doTrustToCertificates();    
     URL url = new URL("https://10.7.3.43:9443/iboss/CustomerCareM1"); 
     HttpsURLConnection conn = (HttpsURLConnection)url.openConnection(); 
     HttpsURLConnection.getDefaultSSLSocketFactory(); 
     System.out.println("ResponseCoede ="+conn.getResponseCode()); 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
    } 
    System.exit(0); 
    //end testing 
} 

// trusting all certificate 
public void doTrustToCertificates() throws Exception { 
    Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
    TrustManager[] trustAllCerts = new TrustManager[]{ 
      new X509TrustManager() { 
       public X509Certificate[] getAcceptedIssuers() { 
        return null; 
       } 

       public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { 
        return; 
       } 

       public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { 
        return; 
       } 
      } 
    }; 

    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    HostnameVerifier hv = new HostnameVerifier() { 
     public boolean verify(String urlHostName, SSLSession session) { 
      if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) { 
       System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'."); 
      } 
      return true; 
     } 
    }; 
    HttpsURLConnection.setDefaultHostnameVerifier(hv); 
} 

и я получаю следующее сообщение об ошибке

javax.net.ssl.SSLHandshakeException: Получен фатальное предупреждение: handshake_failure на sun.security.ssl.Alerts.getSSLException (Unknown Source)

, но хранилище ключей должно быть правильным, так как я использую одно и то же хранилище ключей в SOAPUI 5.1.3, которое может успешно вызвать сервер.

**************** редактировать на 18/5/2015 *************

После того как я закомментируйте следующие код

Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); 
    TrustManager[] trustAllCerts = new TrustManager[]{ 
      new X509TrustManager() { 
       public X509Certificate[] getAcceptedIssuers() { 
        return null; 
       } 

       public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { 
        return; 
       } 

       public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { 
        return; 
       } 
      } 
    }; 

    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 

он может подключиться к серверу https.

+0

«Небезопасное пересмотр» не имеет ничего общего с сертификатами. – EJP

ответ

2

javax.net.ssl.SSLHandshakeException: java.security.cert.Сертификат Исключение: Нет никаких альтернативных альтернативных имен

Это проблема с сертификатом серверов. Вам нужно исправить это, добавив альтернативный раздел темы с соответствующей информацией, чтобы он мог быть успешно проверен. Это не имеет никакого отношения к цепочке доверия, поэтому никаких изменений в keyStore или trustStore не помогает. Дополнительная информация может быть предоставлена, если URL-адрес или сертификат серверов будут известны.

System.setProperty ("sun.security.ssl.allowUnsafeRenegotiation", "true");

Это элемент уровня протокола TLS и не имеет ничего общего с проверкой сертификата.

В случае, если вы не можете исправить сертификат сервера, см. SSLHandshakeException: No subject alternative names present для возможного обходного пути (первое попадание при поиске по этой ошибке!).

+0

Теперь я могу избавиться от «Нет альтернативных имен существ», вызвав функцию doTrustToCertificates(), но затем другую ошибку «javax.net.ssl.SSLHandshakeException: Получено фатальное предупреждение: handshake_failure \t at sun.security.ssl .Alerts.getSSLException (Неизвестный источник) "бросил, я публикую связанную информацию в моем отредактированном вопросе, так как здесь довольно сложно опубликовать комментарий. – user1169587

+0

@ user1169587: к сожалению, похоже, что вы включили любой хак, который вы могли найти в Интернете, в свой код, не понимая, что он делает (отключите безопасную перезагрузку, отключите цепочку доверия, используйте собственную проверку имени хоста ...). Исходя из этого, неясно, что вы на самом деле делаете, а это значит, что на самом деле это невозможно. Я рекомендую вам начинать с нуля и использовать правильную проверку по умолчанию в клиенте и использовать соответствующий сертификат на сервере (т. Е. Доверять и сопоставлять имя хоста), поэтому вам не нужны обходные пути в коде. –

+0

В реальном случае я передам сообщение с мылом на сервер HTTPS и ожидаю получить сообщение с мыла с этого сервера. Привязанный код - это просто урезанная версия в соединении. – user1169587

Смежные вопросы