2012-04-13 23 views
6

Tôi muốn tải xuống tệp từ máy chủ đang sử dụng giao thức kết nối bảo mật HTTPS. Tôi có thể làm điều đó trong máy chủ bình thường, Nhưng, làm thế nào tôi có thể làm điều đó bằng cách sử dụng HTTPS. Nếu có ai đã sử dụng API mẫu, vui lòng giúp tôi tìm các tài nguyên hữu ích.Tải xuống tệp từ máy chủ HTTPS bằng cách sử dụng Java

+0

Bài đăng này (http://stackoverflow.com/questions/1828775/httpclient-and-ssl) có rất nhiều thông tin tốt về thỏa thuận bắt tay SSL và chứng chỉ tự ký. – MarkOfHall

Trả lời

21

Truy cập url HTTPS bằng Java giống nhau sau đó truy cập url HTTP. Bạn luôn có thể sử dụng

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

Tuy nhiên, bạn có thể gặp sự cố khi chuỗi chứng chỉ của máy chủ không thể xác thực. Vì vậy, bạn có thể cần vô hiệu xác nhận chứng chỉ cho mục đích thử nghiệm và tin tưởng tất cả chứng chỉ.

Để thực hiện điều ghi rằng:

// 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

Công trình này tuyệt vời! Chỉ để hoàn thành, Guillaume Polet đã đề xuất một cách để cung cấp quyền khi cần thiết trong chủ đề này http://stackoverflow.com/questions/10479434/server-returned-http-response-code-401-for-url-https. Tôi cũng phải thêm phần đó. –

0

không có sự khác biệt nào khi tải xuống http so với https. mở một HttpURLConnection đến URL chính xác và đọc luồng kết quả.

+0

@hariszhr - điều gì thật buồn cười? – jtahlborn

+1

@hariszhr - HttpsURLConnection là một phân lớp của HttpURLConnection. bạn không cần phải sử dụng trực tiếp lớp đó một cách cụ thể. java sẽ sử dụng việc triển khai chính xác dựa trên giao thức của URL. trong tương lai, tôi sẽ không đề nghị trả lời câu trả lời mà không thực sự hiểu các chi tiết liên quan. – jtahlborn

0

Bạn sẽ có thể làm điều đó với chính xác cùng mã, trừ khi chứng chỉ SSL không xác thực được. Điều này thường xảy ra nếu nó là một ceritifcate tự ký, hoặc nếu chứng chỉ từ một CA mà hệ thống của bạn không biết.

Trong trường hợp này, bạn nên xử lý xác thực chứng chỉ trong mã. Chỉ có một phần của mã của bạn sẽ thay đổi. Mọi thứ khác sẽ vẫn như cũ.

Trước tiên hãy thử với cùng một mã và xem bạn có nhận được Chứng nhận ngoại lệ hay không.

1

Trên thực tế tôi đã có vấn đề tương tự. Tôi không thể tải xuống tệp từ máy chủ HTTPS. Sau đó, tôi cố định vấn đề này với giải pháp này:

// 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(); 
} 

Sử dụng chức năng này ... Hy vọng bạn sẽ có được hưởng lợi với giải pháp dễ dàng này.

Các vấn đề liên quan