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);
}
次のコードを使用してこれを解決しました:
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
try {
chain[0].checkValidity();
} catch (Exception e) {
throw new CertificateException("Certificate not valid or trusted.");
}
}
使用している外部ライブラリからこれに遭遇した場合、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();
あなたのコードがそのようなものである場合:
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はあなたにメールを送ります。自己署名証明書を受け入れるように変更することもできます。私はそれを解決しました ここに私の質問と私の解決策があります