在Android中,可以使用以下代码来解决SSL下载失败的问题:
private static TrustManager[] getTrustManagers() {
TrustManager[] trustManagers = null;
try {
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
trustManagers = trustManagerFactory.getTrustManagers();
if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
}
} catch (NoSuchAlgorithmException | KeyStoreException e) {
e.printStackTrace();
}
return trustManagers;
}
private static void trustAllCertificates() {
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, getTrustManagers(), new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory());
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
}
trustAllCertificates()
方法来信任所有证书: trustAllCertificates();
URL url = new URL("https://example.com/file.pdf");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
InputStream inputStream = connection.getInputStream();
// 保存文件
File file = new File("path/to/save/file.pdf");
FileOutputStream fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, bytesRead);
}
fileOutputStream.close();
inputStream.close();
这样,你就可以通过信任所有证书来解决Android SSL下载失败的问题。请注意,这会忽略证书验证,存在一定的安全风险。在生产环境中,建议使用正式的证书和正确的证书验证方式。