12

我正在尝试通过将数据从 Android 应用程序发布到 PHP 服务器来将记录插入 MySQL。我已将 INTERNET 权限添加到 AndroidManifest.xml

我明白了javax.net.ssl.SSLPeerUnverifiedException: No peer certificate

安卓代码

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());
    }
}

任何人都可以帮忙吗?

4

3 回答 3

7

警告:不要在你不完全信任的网络上使用的生产代码中实现这一点。尤其是任何通过公共互联网传播的东西。这个链接给出了更正确的答案。是使用 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);

如果您有问题,请查看这里
它应该可以工作。

于 2013-06-18T02:53:07.853 回答
2

我在 IIS 8 服务器上遇到了这个问题。在 https 绑定中,我必须取消选中标有“需要服务器名称指示”的复选框。一旦我取消选中它,我就不再收到错误了。

于 2014-05-29T19:51:15.177 回答
1

我不得不说所有受信任的证书(受 COMODO、Symantec 等授权中心信任)在任何情况下都必须有效。如果您的应用收到这样的javax.net.ssl.SSLPeerUnverifiedException: No peer certificate using purchase certificate 您在服务器端给出了错误。要测试使用openssl s_client -connect example.com:443命令来获取有关您的应用程序收到的证书的内部信息。在某些情况下,我的 nginx-server 可能会发送错误的证书。

于 2015-04-08T09:04:21.707 回答