2013-09-29 2 views
0

Я написал ниже код. Импортировать сертификат успешно. Может ли кто-нибудь сказать мне, что может быть причиной получения исключения? Я пытаюсь подключить один IP https://x.x.x.x, но получаю исключение. Я попробовал две вещиjavax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException

1) Пройдя сертификат 2) Скачайте сертификат и добавьте его в хранилище доверия java с помощью keytool. Для меня никто не работает нормально.

package com.dell;  
import java.io.BufferedReader; 
import java.io.DataOutputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.security.GeneralSecurityException; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

public class HttpURLConnectionExample { 
    private final String USER_AGENT = "Mozilla/5.0"; 

    public static void main(String[] args) throws Exception { 
     HttpURLConnectionExample http = new HttpURLConnectionExample(); 
     System.out.println("Testing 1 - Send Http GET request"); 
     http.sendGet(); 
     System.out.println("\nTesting 2 - Send Http POST request"); 
     http.sendPost(); 

    } 

    // HTTP GET request 
    private void sendGet() throws Exception { 
     URL obj = null; 
     TrustManager[] trustAllCerts = new TrustManager[] { 
       new X509TrustManager() {  
        public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
         return null; 
        } 
        public void checkClientTrusted( 
         java.security.cert.X509Certificate[] certs, String authType) { 
         } 
        public void checkServerTrusted( 
         java.security.cert.X509Certificate[] certs, String authType) { 
        } 
       } 
      }; 

     // Install the all-trusting trust manager 
     try { 
      SSLContext sc = SSLContext.getInstance("SSL"); 
      sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
      HttpsURLConnection 
        .setDefaultSSLSocketFactory(sc.getSocketFactory()); 
     } catch (GeneralSecurityException e) { 
     } 
     try { 
      obj = new URL("https://10.94.218.114"); 
     } catch (MalformedURLException e) { 
     } 

     HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
     con.setRequestMethod("GET");   
     con.setRequestProperty("User-Agent", USER_AGENT); 
     int responseCode = con.getResponseCode(); 
     System.out.println("Response Code : " + responseCode); 
     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 
     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 

     //print result 
     System.out.println(response.toString()); 

    } 

    // HTTP POST request 
    private void sendPost() throws Exception { 

     String url = "https://selfsolve.apple.com/wcResults.do"; 
     URL obj = new URL(url); 
     HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

     //add request header 
     con.setRequestMethod("POST"); 
     con.setRequestProperty("User-Agent", USER_AGENT); 
     con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 

     String urlParameters = "sn=C02G8416DRJM&cn=&locale=&caller=&num=12345"; 

     // Send post request 
     con.setDoOutput(true); 
     DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
     wr.writeBytes(urlParameters); 
     wr.flush(); 
     wr.close(); 

     int responseCode = con.getResponseCode(); 
     System.out.println("\nSending 'POST' request to URL : " + url); 
     System.out.println("Post parameters : " + urlParameters); 
     System.out.println("Response Code : " + responseCode); 

     BufferedReader in = new BufferedReader(
       new InputStreamReader(con.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     in.close(); 
     System.out.println(response.toString()); 

    } 

} 
+0

Вы можете показать полное исключение? Он должен указать, что не так с сертификатом. – Thilo

+0

Исключение в потоке "основного" javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Нет Subject Alternative имена присутствующих \t в sun.security.ssl.Alerts.getSSLException (Unknown Source) \t в sun.security .ssl.SSLSocketImpl.fatal (Unknown Source) \t на sun.security.ssl.Handshaker.fatalSE (Unknown Source) \t на sun.security.ssl.Handshaker.fatalSE (Unknown Source) \t в sun.security.ssl .ClientHandshaker.serverCertificate (Неизвестный источник) \t at sun.security.ssl.ClientHandshaker.processMessage (Неизвестный источник) \t at sun.security.ssl.Handshaker.processLoop (U nknown Source) – amiton2006

+0

Вызвано: java.security.cert.Certificate Исключение: нет никаких альтернативных имен объектов at sun.security.util.HostnameChecker.matchIP (Неизвестный источник) – amiton2006

ответ

5

Это точно такая же проблема, как в this question. По умолчанию Java имя хоста верификатор реализует RFC 2818 строго, когда речь идет IP-адреса:

В некоторых случаях, URI задаются как IP-адрес, а не имя хоста. В этом случае объект subjectAltName iPAddress должен присутствовать в сертификате и должен точно соответствовать IP-адресу в URI.

В частности, он не возвращается к CN в DN объекта, если IP-адрес не найден в SAN.

По сути, сертификат для этой службы не соответствует спецификации HTTPS (но некоторые браузеры все равно ее принимают).

Вы должны связаться с теми, кто контролирует этот сервер, и попросить их установить сертификат с записью SAN для этого IP-адреса (обратите внимание, что тип записи должен быть «IP-адресом», а не «DNS»)).

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