web-dev-qa-db-ja.com

Android 4.4以下のSSLHandshakeException

POSTメソッドでPaypalRest APIに接続したいときに問題が発生しました。modernhttpclientを使用していないと、エラーが発生しました

The authentication or decryption has failed. 

しかし、modernhttpclientを使用している場合は、Android API 23(Marshmallow)で動作し、Android API 19(デバイス)およびAndroid API 16(エミュレーター)エラーが発生しました

ex {Javax.Net.Ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=…} Javax.Net.Ssl.SSLHandshakeException

sslハンドシェイク例外Android によると、カスタムソケットファクトリを使用する必要があります。しかし、どうすればHttpClientまたはmodernHttpClientに実装できますか?

16
albilaga

私があなたの質問に完全に答えることができるかどうかはわかりませんが、試してみます:

Paypalを分析する場合REST APIエンドポイント、たとえばSSLラボでそのように https://www.ssllabs.com/ssltest/analyze.html?d=api.sandbox .Paypal.com&hideResults = on 、TLS1.2プロトコルのみをサポートしていることがわかります。

現在AndroidはAPIレベル16以降、これをサポートしています。こちらをご覧ください https://developer.Android.com/reference/javax/net/ssl/SSLSocket.html ですが、デフォルトでは無効になっており、APIレベル20以上でのみ有効になっています。

Xamarinフォーラムで、誰かがModernHttpClientをフォークして改良されたSSLソケットファクトリを追加することにより、Android APIレベル16〜19でTLS 1.2を有効にするためのソリューションを投稿しました: https:// forums。 xamarin.com/discussion/63005/modernhttpclient-tls-1-2-Android-api-19

これにより、これらのAndroidバージョンの問題は修正されますが、Android 4.1より前のバージョンでは役に立ちません。

9
Florian Haider

Google Play開発者サービスのProviderInstallerを使用できます。これにより、システムのSSLプロバイダーがGoogleが提供する最新のプロバイダーに置き換えられます。

https://developer.Android.com/training/articles/security-gms-provider.html

アプリケーションのonCreate()で初期化すると、そのエラーはなくなります。どういうわけかXamarinからそれを行うことができると確信しています。

1
stephane k.

基本的に、この問題は、サーバー側のSSLでチェーンが壊れている場合に発生します。サーバーにはチェーン全体を含め、中間のルートチェーンを含める必要があります。

詳細については、このリンクを参照してください。

https://developer.Android.com/training/articles/security-ssl.html

0
Nitin Jain

これはいくつかの理由によるものです。

  1. 古いAndroidデバイスでのTLS1.2サポートを取り巻く明確さの欠如があります。
  2. デバイスメーカーは、公式のAndroidデバイスでTLS1.2を出荷するための仕様に対して異なるコミットメントを持っています
  3. キャリアとデバイスメーカーは、顧客にソフトウェアとセキュリティのアップデートを提供することに対して異なるコミットメントを持っています。

デフォルトで有効になっていないAndroid 4.0デバイス)に対してTLS v1.2を強制できます

これを修正するには、次のコードを非同期呼び出しとして使用します。

    ProviderInstaller.installIfNeededAsync(getApplicationContext(), new 
    ProviderInstaller.ProviderInstallListener() {
                @Override
                public void onProviderInstalled() {
                    SSLContext sslContext;
                    try {
                        sslContext = SSLContext.getInstance("TLSv1.2");
                        sslContext.init(null, null, null);
                        sslContext.createSSLEngine();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

                @Override
                public void onProviderInstallFailed(int i, Intent intent) {

                }
            });

詳細については、このリファレンスを使用してください

https://ankushg.com/posts/tls-1.2-on-Android/

0
mani