Android 发出GET请求时发生SSLProtocolException
我们有一个sdk,可以集成在android应用程序中。sdk发出一些HTTP/HTTPS GET请求。 下面是执行此操作的代码Android 发出GET请求时发生SSLProtocolException,android,https,Android,Https,我们有一个sdk,可以集成在android应用程序中。sdk发出一些HTTP/HTTPS GET请求。 下面是执行此操作的代码 public boolean sendDataToServer(String url) { try { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); int responseCode = conn.getResponseCod
public boolean sendDataToServer(String url) {
try {
HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
int responseCode = conn.getResponseCode();
if(responseCode != 200) {
String responseBody = getAndClose(conn.getErrorStream());
return false;
}
} catch (Exception e) {
return false;
}
return true;
}
private String getAndClose(InputStream stream) throws IOException {
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
String line;
StringBuilder content = new StringBuilder();
while ((line = reader.readLine()) != null) {
content.append(line).append('\n');
}
return content.toString();
} finally {
if (stream != null) {
stream.close();
}
}
}
但是,对于一个应用程序,当它尝试使用HTTPS连接时,会出现以下错误
IOExcetion while sending the data to server javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x650ed348: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x5e84cf1c:0x00000000)
在同一个设备中,如果我安装了另一个带有sdk的应用程序,并发出相同的GET请求,那么它工作正常,我会得到200个OK响应
为什么会发生这种情况以及如何防止这种情况?使用HttpUrlConnection.setDefaultSSLSocketFactory()方法
您需要HTTPS的SSLCertificate
final TrustManager[] certs = new TrustManager[]{new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
X509Certificate[] x509Certificates = new X509Certificate[0];
return x509Certificates;
}
@Override
public void checkServerTrusted(final X509Certificate[] chain,
final String authType) {
}
@Override
public void checkClientTrusted(final X509Certificate[] chain,
final String authType) {
}
}};
SSLContext ctx = null;
ctx = SSLContext.getInstance("TLS");
ctx.init(null, certs, new SecureRandom());
HttpUrlConnection.setDefaultSSLSocketFactory(ctx.getSocketFactory();