12

Android アプリから PHP サーバーにデータを送信して、MySQL にレコードを挿入しようとしています。AndroidManifest.xml に INTERNET 権限を追加しました

私は得る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());
    }
}

誰でも助けることができますか?

4

3 に答える 3

7

警告: 完全に信頼していないネットワークで使用する本番コードにこれを実装しないでください。特に公共のインターネットを介して行われるもの。このリンクは、より正しい答えを提供します。ここでは、SSL を使用した実装を示します。

あなたの問題は、https(セキュアURL)にDefaultHttpClientを使用していることです。
カスタム 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 バインディングでは、「Require Server Name Indication」というラベルの付いたチェックボックスをオフにする必要がありました。チェックを外すと、エラーが発生しなくなりました。

于 2014-05-29T19:51:15.177 に答える
1

すべての信頼できる証明書 (COMODO、Symantec などの認定センターによって信頼されている) は、いずれにしても機能する必要があると言わざるを得ません。アプリがこのようなjavax.net.ssl.SSLPeerUnverifiedException: No peer certificate using 購入した証明書を受け取った場合、サーバー側で何か問題が発生しています。テストするには、openssl s_client -connect example.com:443コマンドを使用して、アプリが受け取る証明書に関する内部情報を取得します。場合によっては、私のnginxサーバーが間違った証明書を送信する場合があります。

于 2015-04-08T09:04:21.707 に答える