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に実装できますか?
私があなたの質問に完全に答えることができるかどうかはわかりませんが、試してみます:
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より前のバージョンでは役に立ちません。
Google Play開発者サービスのProviderInstallerを使用できます。これにより、システムのSSLプロバイダーがGoogleが提供する最新のプロバイダーに置き換えられます。
https://developer.Android.com/training/articles/security-gms-provider.html
アプリケーションのonCreate()で初期化すると、そのエラーはなくなります。どういうわけかXamarinからそれを行うことができると確信しています。
基本的に、この問題は、サーバー側のSSLでチェーンが壊れている場合に発生します。サーバーにはチェーン全体を含め、中間のルートチェーンを含める必要があります。
詳細については、このリンクを参照してください。
https://developer.Android.com/training/articles/security-ssl.html
これはいくつかの理由によるものです。
デフォルトで有効になっていない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) {
}
});
詳細については、このリファレンスを使用してください