2012-04-13 2 views
6

Я хочу загрузить файл с сервера, который использует протокол защищенного соединения HTTPS. Я мог бы сделать это на обычном сервере, но, как я могу это сделать, используя HTTPS. Если кто-то использовал образец API, пожалуйста, помогите мне найти полезные ресурсы.Загрузить файл с сервера HTTPS с помощью Java

+0

В этом [сообщении] (http://stackoverflow.com/questions/1828775/httpclient-and-ssl) есть много хорошей информации о переговорах о присоединении к SSL и самозаверяющем сертификате. – MarkOfHall

ответ

21

Доступ к HTTPS-url с помощью Java - это то же самое, что и доступ к URL-адресу HTTP. Вы всегда можете использовать

URL url = new URL("https://hostname:port/file.txt"); 
URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream(); 
// .. then download the file 

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

Для этого запись:

// Create a new trust manager that trust all certificates 
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) { 
     } 
    } 
}; 

// Activate the new trust manager 
try { 
    SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
} catch (Exception e) { 
} 

// And as before now you can use URL and URLConnection 
URL url = new URL("https://hostname:port/file.txt"); 
URLConnection connection = url.openConnection(); 
InputStream is = connection.getInputStream(); 
// .. then download the file 
+3

Это отлично работает! Как раз для завершения, Гийом Полет предложил способ предоставления разрешений при необходимости в этом потоке http://stackoverflow.com/questions/10479434/server-returned-http-response-code-401-for-url-https. Я должен был добавить эту часть. –

0

нет никакой разницы, загружая http vs https. откройте HttpURLConnection до правильного URL-адреса и прочитайте полученный поток.

+0

@hariszhr - что смешно? – jtahlborn

+1

@hariszhr - HttpsURLConnection является подклассом HttpURLConnection. вам не нужно специально использовать этот класс напрямую. java будет использовать правильную реализацию на основе протокола URL. в будущем я бы не предлагал насмешливых ответов, фактически не понимая соответствующих деталей. – jtahlborn

0

Вы должны иметь возможность сделать это с помощью одного и того же кода, если SSL certifcate не завершит проверку. Это, как правило, происходит, если это самоподписанное ceritifcate, или если сертификат принадлежит CA, о котором ваша система не знает.

В таком случае вы должны обработать проверку сертификата в коде. Только эта часть вашего кода изменится. Все остальное останется прежним.

Сначала попробуйте с тем же кодом и посмотрите, получаете ли вы исключение сертификата.

1

На самом деле у меня была аналогичная проблема. Мне не удалось загрузить файлы с сервера HTTPS. Затем я исправил эту проблему с помощью этого решения:

// But are u denied access? 
// well here is the solution. 
public static void TheKing_DownloadFileFromURL(String search, String path) throws IOException { 

    // This will get input data from the server 
    InputStream inputStream = null; 

    // This will read the data from the server; 
    OutputStream outputStream = null; 

    try { 
     // This will open a socket from client to server 
     URL url = new URL(search); 

     // This user agent is for if the server wants real humans to visit 
     String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"; 

     // This socket type will allow to set user_agent 
     URLConnection con = url.openConnection(); 

     // Setting the user agent 
     con.setRequestProperty("User-Agent", USER_AGENT); 

     //Getting content Length 
     int contentLength = con.getContentLength(); 
     System.out.println("File contentLength = " + contentLength + " bytes"); 


     // Requesting input data from server 
     inputStream = con.getInputStream(); 

     // Open local file writer 
     outputStream = new FileOutputStream(path); 

     // Limiting byte written to file per loop 
     byte[] buffer = new byte[2048]; 

     // Increments file size 
     int length; 
     int downloaded = 0; 

     // Looping until server finishes 
     while ((length = inputStream.read(buffer)) != -1) 
     { 
      // Writing data 
      outputStream.write(buffer, 0, length); 
      downloaded+=length; 
      //System.out.println("Downlad Status: " + (downloaded * 100)/(contentLength * 1.0) + "%"); 


     } 
    } catch (Exception ex) { 
     //Logger.getLogger(WebCrawler.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    // closing used resources 
    // The computer will not be able to use the image 
    // This is a must 
    outputStream.close(); 
    inputStream.close(); 
} 

Используйте эту функцию ... Надеюсь, вам пригодится это простое решение.

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