我试图通过从Android应用程序向PHP服务器发布数据来将记录插入MySQL。我已将INTERNET权限添加到AndroidManifest.xml
我得到javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
Android代码
private void senddata(ArrayList<NameValuePair> data)
{
try
{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php");
httppost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = httpclient.execute(httppost);
}
catch (Exception e) {
// TODO: handle exception
Log.e("log_tag", "Error: "+e.toString());
}
}
有人可以帮忙吗?
答案 0 :(得分:7)
警告:请勿在您不会完全信任的网络上使用的生产代码中实现此功能。特别是在公共互联网上的任何事情。 This link给出了更正确的答案。 Here是使用SSL的实现。
您的问题是您使用DefaultHttpClient作为https
(安全网址)。
创建自定义DefaultHttpClient
public static 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);
}
如下所示更改代码:
HttpClient httpclient = createHttpClient();
HttpPost httppost = new HttpPost("https://10.0.2.2/insert222.php");
httppost.setEntity(new UrlEncodedFormEntity(data));
HttpResponse response = httpclient.execute(httppost);
如果您遇到问题,请查看here 它应该工作。
答案 1 :(得分:2)
我遇到了IIS 8服务器的这个问题。在https绑定中,我必须取消选中标有&#34;要求服务器名称指示的复选框。&#34;一旦我取消选中它,我就会退出错误。
答案 2 :(得分:0)
我必须说所有受信任的证书(由COMODO,Symantec等授权中心信任)都必须在任何情况下都能正常工作。如果您的应用程序收到使用购买的证书的 javax.net.ssl.SSLPeerUnverifiedException:No peer certificate ,那么您在服务器端会出错。
要测试使用openssl s_client -connect example.com:443
命令获取有关您的应用程序接收的证书的内部信息。
在可能的情况下,我的nginx-server在某些情况下发送了错误的证书。