web-dev-qa-db-ja.com

AndroidアプリでのX509TrustManagerの安全でない実装を修正する方法

Googleは、AndroidアプリケーションにX509TrustManagerインターフェースの安全でない実装があり、次のようにコードを変更する必要があることをアドバイスしています。

SSL証明書の検証を適切に処理するには、カスタムX509TrustManagerインターフェイスのcheckServerTrustedメソッドのコードを変更して、サーバーによって提示された証明書が期待を満たさない場合にCertificateExceptionまたはIllegalArgumentExceptionを発生させます。技術的な質問については、Stack Overflowに投稿して、タグ「Android-security」および「TrustManager」を使用できます。

上記の問題を修正するために、次のコードをどのように変更できますか?

public EasySSLSocketFactory(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;
        }
    };

    mContext.init(null, new TrustManager[] { tm }, null);
}
20
Nabeel

次のコードを使用してこれを解決しました:

public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                try {
                    chain[0].checkValidity();
                } catch (Exception e) {
                    throw new CertificateException("Certificate not valid or trusted.");
                }
            }
23
Nabeel

使用している外部ライブラリからこれに遭遇した場合、appache librarayが原因かどうかを確認してください。

私にとって、Apacheライブラリはエラーを引き起こしました:非推奨のクラスを使用していました- MultipartEntity 。このクラスは SSLContextBuilder を使用し、これは TrustManagerDelegate を使用します。 TrustManagerDelegateはX509TrustManagerを実装します。これにより、Google Playストアにアプリケーションをアップロードするときに「TrustManagerの安全でない実装」エラーが発生します。

解決策は、非推奨の MultipartEntity クラスではなく、 MultipartEntityBuilder を使用することです。

例えば ​​:

MultipartEntity httpMultipart = new MultipartEntity();
String contentType = httpMultipart.getContentType().getValue();

に置き換えられます:

MultipartEntityBuilder httpMultipart = new MultipartEntityBuilder();
String contentType = httpMultipart.build().getContentType().getValue();
1
Dus

あなたのコードがそのようなものである場合:

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

それはすべての証明書を受け入れ、それは悪い考えですので、Googleはあなたにメールを送ります。自己署名証明書を受け入れるように変更することもできます。私はそれを解決しました ここに私の質問と私の解決策があります

0
zys