android 应用程序中的错误:javax.net.ssl.SSLPeerUnverifiedException:没有对等证书
Error in android application: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
你好,可以求教一下。
我的代码工作正常,但有一天没有明显的原因并且没有更改服务器上的代码停止工作,显示此错误
我已经检查了链接所指的决定,但其中 none 给出了预期的结果。
也许 SSL 协议中有什么东西?
Safely fixing: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
javax.net.ssl.sslpeerunverifiedexception no peer certificate
Android ssl: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
class RequestTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
try {
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
DefaultHttpClient client = new DefaultHttpClient();
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory
.getSocketFactory();
socketFactory
.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(
client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr,
client.getParams());
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
ResponseHandler<String> res = new BasicResponseHandler();
HttpPost postMethod = new HttpPost("https://api.equalibra.net/banners.json");
nameValuePairs.add(new BasicNameValuePair("lang", "rus"));
postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs,
HTTP.UTF_8));
String response = "";
try {
response = httpClient.execute(postMethod, res);
} catch (Exception e) {
Log.d("my", e.toString());
}
JSONURL(response);
} catch (Exception e) {
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
服务器需要使用 SNI (server name indication)。不使用 SNI 的连接将简单地失败,而不是通常情况下获得默认证书的情况。由于这是服务器端的设置,它最近可能已更改,因此破坏了您的代码。
虽然 SNI 在较新版本的 Apache HTTP 客户端库中可用,但在您可能使用的 Android SDK 附带的版本中不可用。
的确,问题是我的 Android SDK 不支持 SNI。
It helped me:
你好,可以求教一下。 我的代码工作正常,但有一天没有明显的原因并且没有更改服务器上的代码停止工作,显示此错误 我已经检查了链接所指的决定,但其中 none 给出了预期的结果。 也许 SSL 协议中有什么东西?
Safely fixing: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
javax.net.ssl.sslpeerunverifiedexception no peer certificate
Android ssl: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
class RequestTask extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
try {
HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
DefaultHttpClient client = new DefaultHttpClient();
SchemeRegistry registry = new SchemeRegistry();
SSLSocketFactory socketFactory = SSLSocketFactory
.getSocketFactory();
socketFactory
.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
registry.register(new Scheme("https", socketFactory, 443));
SingleClientConnManager mgr = new SingleClientConnManager(
client.getParams(), registry);
DefaultHttpClient httpClient = new DefaultHttpClient(mgr,
client.getParams());
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
ResponseHandler<String> res = new BasicResponseHandler();
HttpPost postMethod = new HttpPost("https://api.equalibra.net/banners.json");
nameValuePairs.add(new BasicNameValuePair("lang", "rus"));
postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs,
HTTP.UTF_8));
String response = "";
try {
response = httpClient.execute(postMethod, res);
} catch (Exception e) {
Log.d("my", e.toString());
}
JSONURL(response);
} catch (Exception e) {
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}
服务器需要使用 SNI (server name indication)。不使用 SNI 的连接将简单地失败,而不是通常情况下获得默认证书的情况。由于这是服务器端的设置,它最近可能已更改,因此破坏了您的代码。
虽然 SNI 在较新版本的 Apache HTTP 客户端库中可用,但在您可能使用的 Android SDK 附带的版本中不可用。
的确,问题是我的 Android SDK 不支持 SNI。 It helped me: