I want to download a file from the server which is using the secured connection protocol HTTPS. I could do it in the normal server, But, how I can do it using the HTTPS. If anyone have used the sample API, please help me to find the useful resources.
-
This [post](http://stackoverflow.com/questions/1828775/httpclient-and-ssl) has a lot of good info on SSL handshake negotiation and self signed certificate. – MarkOfHall Apr 13 '12 at 04:29
4 Answers
Access an HTTPS url with Java is the same then access an HTTP url. You can always use the
URL url = new URL("https://hostname:port/file.txt");
URLConnection connection = url.openConnection();
InputStream is = connection.getInputStream();
// .. then download the file
But, you can have some problem when the server's certificate chain cannot be validated. So you may need to disable the validation of certificates for testing purposes and trust all certificates.
To do that write:
// 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

- 7,677
- 1
- 30
- 35
-
4This works great! Just for the completion, Guillaume Polet has suggested a way to provide permissions when needed in this thread http://stackoverflow.com/questions/10479434/server-returned-http-response-code-401-for-url-https. I had to add that part as well. – isuru chathuranga Apr 23 '14 at 10:58
-
Actually I had the similar problem. I was unable to download files from HTTPS server. Then I fixed this problem with this solution:
// 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();
}
Use this function... Hope you will get benefited with this easy solution.

- 1,234
- 1
- 15
- 35
You should be able to do it with exactly the same code, unless the SSL certifcate fails validations. This would normally happen if its a self-signed ceritifcate, or if the certificate is from a CA which your system doesn't know about.
In such case, you should handle the certificate validation in code. Only that part of your code would change. Everything else will remain the same.
First try out with the same code, and see if you get a Certificate Exception.

- 9,016
- 2
- 39
- 68
there's no difference downloading http vs https. open a HttpURLConnection to the correct URL and read the resulting stream.

- 52,909
- 5
- 76
- 118
-
-
1@hariszhr - HttpsURLConnection is a subclass of HttpURLConnection. you don't need to specifically use that class directly. java will use the correct implementation based on the protocol of the URL. in the future, i wouldn't suggest mocking answers without actually understanding the relevant details. – jtahlborn Mar 05 '16 at 17:46