javax.net.ssl.sslpeerunverifiedexception没有对等证书

时间:2013-06-18 02:24:18

标签: android ssl https

我试图通过从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());
    }
}

有人可以帮忙吗?

3 个答案:

答案 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在某些情况下发送了错误的证书。