web-dev-qa-db-ja.com

安全な修正:javax.net.ssl.SSLPeerUnverifiedException:ピア証明書なし

この問題に関する多数の投稿があります(javax.net.ssl.SSLPeerUnverifiedException:No peer certificate)が、私に役立つものは見つかりませんでした。

多くの投稿( thisthis など)は、すべての証明書を受け入れることでこれを「解決」しますが、もちろん、これはテスト以外には良い解決策ではありません。

他のものはかなりローカライズされているようで、私にはうまくいきません。誰かが私に欠けている洞察を持っていることを本当に願っています。

したがって、私の問題:HTTPS経由で接続しているローカルネットワークからのみアクセス可能なサーバーでテストしています。ブラウザーを介して必要な呼び出しを行うと問題なく動作します。証明書について文句を言う必要はありません。証明書を確認すれば、すべて問題ありません。

Androidデバイスで試すと、_javax.net.ssl.SSLPeerUnverifiedException: No peer certificate_

これを呼び出すコードは次のとおりです。

_StringBuilder builder = new StringBuilder();
builder.append( /* stuff goes here*/ );

httpGet.setEntity(new UrlEncodedFormEntity(nameValuePairs));
ResponseHandler<String> responseHandler = new BasicResponseHandler();

// Execute HTTP Post Request. Response body returned as a string
HttpClient httpClient = MyActivity.getHttpClient();
HttpGet httpGet = new HttpGet(builder.toString());

String jsonResponse = httpClient.execute(httpGet, responseHandler); //Line causing the Exception
_

MyActivity.getHttpClient()の私のコード:

_protected synchronized static HttpClient getHttpClient(){
    if (httpClient != null)
        return httpClient;

    HttpParams httpParameters = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParameters, TIMEOUT_CONNECTION);
    HttpConnectionParams.setSoTimeout(httpParameters, TIMEOUT_SOCKET);
    HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);

    //Thread safe in case various AsyncTasks try to access it concurrently
    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
    schemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
    ClientConnectionManager cm = new ThreadSafeClientConnManager(httpParameters, schemeRegistry);

    httpClient = new DefaultHttpClient(cm, httpParameters);

    CookieStore cookieStore = httpClient.getCookieStore();
    HttpContext localContext = new BasicHttpContext();
    localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);

    return httpClient;
}
_

どんな助けでも大歓迎です。

編集

また、別のアプリで他のSSLの問題が発生したことは言うまでもありませんが、SchemeRegistryの部分を追加することで以前に修正されました。

Edit 2

これまでのところ、Android 3.1でしかテストしていませんが、Android 2.2+に関係なく、これを動作させる必要があります。 Android tab(Android 3.1)そして、それは証明書について文句を言います。それは私のPCブラウザでは問題ありませんが、Androidブラウザまたは私のアプリではそうではありません。

Edit 3

IOSブラウザーも文句を言っています。ここで説明されている証明書チェーンの問題だと考え始めています( SSL証明書は信頼されません-モバイルのみ

33
Mike T

私のコードは問題なく、問題はサーバーが完全な証明書チェーンを返していないことでした。詳細については、このSO投稿およびこのスーパーユーザー投稿を参照してください。

SSL証明書は信頼されません-モバイルのみ

https://superuser.com/questions/347588/how-do-ssl-chains-work

19
Mike T

以下のコードを試してください:-

        BasicHttpResponse httpResponse = null;

        HttpPost httppost = new HttpPost(URL);

        HttpParams httpParameters = new BasicHttpParams();
        // Set the timeout in milliseconds until a connection is
        // established.
        int timeoutConnection = ConstantLib.CONNECTION_TIMEOUT;
        HttpConnectionParams.setConnectionTimeout(httpParameters,
                timeoutConnection);
        // Set the default socket timeout (SO_TIMEOUT)
        // in milliseconds which is the timeout for waiting for data.
        int timeoutSocket = ConstantLib.CONNECTION_TIMEOUT;
        HttpConnectionParams
                .setSoTimeout(httpParameters, timeoutSocket);

        DefaultHttpClient httpClient = new DefaultHttpClient(
                httpParameters);
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair(ConstantLib.locale,
                locale));
5
Yogesh Tatwal

私の場合、すべてが正常に機能していました。突然2日後にデバイスにhttpsサイトまたは画像リンクが表示されなくなりました。

いくつかの調査の後、私の時間設定がデバイス上で最新ではなかったことが判明しました。

時間設定を適切に変更しましたが、うまくいきました。