0

こんにちは、私のアプリケーションはライブで、「https」プロトコルを使用しています。Google Play チームは、次のような警告をスローします。

「この電子メールの最後に記載されているアプリは、X509TrustManager インターフェースの安全でない実装を使用しています。具体的には、この実装は、リモート ホストへの HTTPS 接続を確立するときにすべての SSL 証明書検証エラーを無視するため、アプリが man-攻撃者は、送信されたデータ (ログイン資格情報など) を読み取ったり、HTTPS 接続で送信されたデータを変更したりする可能性があります. アカウントに影響を受けるアプリが 20 個以上ある場合は、開発者コンソールで完全なリスト。

SSL 証明書の検証を適切に処理するには、カスタム X509TrustManager インターフェースの checkServerTrusted メソッドのコードを変更して、サーバーによって提示された証明書が期待どおりでない場合は常に CertificateException または IllegalArgumentException を発生させます。Google Play は、インターフェース X509TrustManager の安全でない実装を含む新しいアプリまたはアップデートの公開をブロックします。」

私のプロジェクトでは、カスタム http クライアントを使用して、デフォルトの httpClient の代わりに HTTPS を処理しています。私のコードは以下の通りです。

    public static HttpClient getNewHttpClient() {
            try
            {
                KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
                trustStore.load(null, null);

                MySSLSocketFactory sf = new MySSLSocketFactory(trustStore);
                sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

                HttpParams params = new BasicHttpParams();
                HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
                HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

                SchemeRegistry registry = new SchemeRegistry();
                registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
                registry.register(new Scheme("https", sf, 443));

                ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

                return new DefaultHttpClient(ccm, params);
            }
            catch (Exception e)
            {
                return new DefaultHttpClient();
            }
        }

public static class MySSLSocketFactory extends SSLSocketFactory {
        SSLContext sslContext = SSLContext.getInstance("TLS");

        public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
            super(truststore);

            TrustManager tm = new X509TrustManager() {
                public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }

                public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                }

                public X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };

            sslContext.init(null, new TrustManager[] { tm }, null);
        }

        @Override
        public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
            return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
        }

        @Override
        public Socket createSocket() throws IOException {
            return sslContext.getSocketFactory().createSocket();
        }
    }

この問題を克服するにはどうすればよいですか?好意的な回答を期待しています。

4

2 に答える 2

3

関連するコードを投稿したので、引用されたメッセージのどの部分が理解できないのかを確認するのは困難です。

修正は、ルートとブランチのコードの一部を完全に削除し、デフォルトのものを使用してから、トラストストアの内容を調整してすべてを信頼することにより、適切なTrustManager方法で発生する可能性のある問題に対処することです。デフォルトではまだ信頼されていない、信頼する必要がある証明書。もしあれば、あってはならないもの。

于 2016-03-07T05:16:58.540 に答える
0

カスタム SSLSocketFactory が必要な理由。DefaultHttpClientデフォルトですべての https を処理する and を使用できます。参考までに、これHttpClientは非推奨であり、を使用します HttpURLConnection

于 2016-03-07T05:23:43.260 に答える