httpsでしか利用できないWebサービスを使用するのにはいくつかの困難があります。HTTPS経由のXamarin Android Webサービス
これも問題を抱えている他の人からの投稿を読んだことがありますが、これまでに見た回答のうちどれも私の問題を解決していないので、ここで問題を説明しようと思いますこの障害を乗り越える方法を知っている人もいます。
私は特にAndroid用に開発したXamarin Studio 6.1.1を使用しています。 私は "AndroidClientHandler"(これは最新の実装であり、TLS1.2をサポートするはずです)にプロジェクトの "Android Build"の下に "HttpClient Implementation"を設定しました。
WebサービスにWeb参照(WCFとしてではなく)を追加し、プロンプトが表示されたらログイン情報を提供しました...これまでのところすべてが期待通りに進んでいます。
注:Visual StudioのコンソールアプリケーションからWebサービスをテストしたところ、期待どおりに動作しています。
しかし、私がWebサービスのメソッドの1つを呼び出そうとすると、これまでに遭遇した多くの人が私に遭遇したのと同じエラーが発生します。これは "Error:TrustFailure(認証または復号化に失敗しました。 )」。
私は以前掲載された解決策のいくつかを試しましたが、何も助けに見えません。
1.A)ServicePointManagerためのコールバック関数を提供する:
ServicePointManager.ServerCertificateValidationCallback += CertificateValidationCallBack;
1.B)コールバック関数:
private static bool CertificateValidationCallBack(
object sender,
System.Security.Cryptography.X509Certificates.X509Certificate certificate,
System.Security.Cryptography.X509Certificates.X509Chain chain,
System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
// If the certificate is a valid, signed certificate, return true.
if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
{
return true;
}
// If there are errors in the certificate chain, look at each error to determine the cause.
if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
{
if (chain != null && chain.ChainStatus != null)
{
foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
{
if ((certificate.Subject == certificate.Issuer) &&
(status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
{
// Self-signed certificates with an untrusted root are valid.
continue;
}
else
{
if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
{
// If there are any other errors in the certificate chain, the certificate is invalid,
// so the method returns false.
return false;
}
}
}
}
// When processing reaches this line, the only errors in the certificate chain are
// untrusted root errors for self-signed certificates. These certificates are valid
// for default Exchange server installations, so return true.
return true;
}
else
{
// In all other cases, return false.
return false;
}
}
2)AesCryptoServiceProviderのインスタンスを作成するには:
System.Security.Cryptography.AesCryptoServiceProvider b = new System.Security.Cryptography.AesCryptoServiceProvider();
誰かが解決策を持つことができれば、これは明らかにかなり一般的な問題です。
種類について、 Aidal
なるほど!これは実際には現在のバージョンのバグです。つまり、私が何をしているにせよ、これを動作させることはできません。その場合、私の唯一の選択肢は修正を待つことだと思いますか? – Aidal
さて、どのポート番号を使用していますか? 443はうまくいくはずです。また、認証検証コールバックから 'true'を返すことは、回避策として役立つはずですが、*は生産的なアプリ*のオプションではありません。 – Krumelur
ポートは443ではありません。この変更をリクエストすることはできません。私はすでにあなたが言及した回避策を試してきましたが、うまくいきません。私は問題のサービスからいくつかの回答を連載しています。私は、問題がすぐに解決されることを期待しながら、私のアプリでそれらのサービスと一緒に働いています。リリースページの既知の問題に私の関心を引き付けることに感謝します。 – Aidal