【发布时间】:2014-06-05 21:06:56
【问题描述】:
几天前,我升级了我的应用引擎服务器,使其仅处理安全 HTTP 请求 (HTTPS)。 (通过在 app.yaml 文件中添加 'secure: always' 行)。
一切正常,我确实设法通过我的应用(在 android 4.1.2 上运行)从我的应用引擎服务器获得响应,但今天我发现在 4.4.2 设备上,我收到以下错误:
06-04 20:11:29.501: W/System.err(21158): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
06-04 20:11:29.504: W/System.err(21158): at com.android.org.conscrypt.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:146)
06-04 20:11:29.505: W/System.err(21158): at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
06-04 20:11:29.505: W/System.err(21158): at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:388)
06-04 20:11:29.505: W/System.err(21158): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:165)
06-04 20:11:29.506: W/System.err(21158): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
06-04 20:11:29.506: W/System.err(21158): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
06-04 20:11:29.506: W/System.err(21158): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
06-04 20:11:29.507: W/System.err(21158): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
06-04 20:11:29.507: W/System.err(21158): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
06-04 20:11:29.507: W/System.err(21158): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
这是客户端中负责发送带有http post请求的json的代码:
static private String getJson(String json,String url){
HttpClient httpClient = new DefaultHttpClient();
String responseString="";
try {
HttpPost request = new HttpPost("https://XXXXXX.appspot.com/XXXX/XXXX");
StringEntity params =new StringEntity(json, "UTF-8");
request.addHeader("content-type", "application/json");
request.setEntity(params);
HttpResponse response = httpClient.execute(request);
HttpEntity entity = response.getEntity();
responseString = EntityUtils.toString(entity, "UTF-8");
}catch (Exception ex) {
ex.printStackTrace();
// handle exception here
} finally {
httpClient.getConnectionManager().shutdown();
}
return responseString;
}
我怀疑我在较新的设备上执行 HTTP 发布请求的这种方式有些错误(这是我能想到的唯一原因,因为它可以在我的设备上完美运行,但在较新的设备上却不行)
我也尝试使用这种方法创建我的 HttpClient 对象(我看到它有时可以解决问题)但它根本没有帮助:
static private HttpClient createHttpClient()
{
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(conMgr, params);
}
已经使用了大约 8 个小时,已经扫描了所有互联网,但没有解决方案。
感谢帮助。
【问题讨论】:
-
我想我今天看到了第二篇类似的帖子。我的猜测是 4.4.2 中有一个新的信任库,并且该信任库不支持您的 ssl 证书。要检查的事项:您的证书是自签名的吗?您的证书是否在 4.4.2 受信任证书(设置 -> 安全 -> 受信任凭据)中?您的网站是否发送了正确的链文件(stackoverflow.com/questions/13862908/… 见第一个答案)?可能还有其他问题。证书很难。您可以尝试使用 -Djavax.net.debug=ssl 选项运行您的应用程序吗?
-
@hooknc 如果我理解正确,我的证书不是自签名的。我什至根本没有弄乱证书。我的服务器在谷歌应用引擎平台上运行,它提供了通过在 yaml.app 文件中添加一行来执行所有高于安全 HTTP 的通信的选项,我相信谷歌的证书不应该有任何问题......我还检查了 SSL 检查器站点中的 URL,一切正常。如果您有任何其他想法为什么它可能在较新的设备上失败,您能否逐步回答如何(尝试)修复它?谢谢
标签: java android google-app-engine http