Xamarin基于HTTPS的Android Web服务

时间:2016-09-28 11:20:21

标签: android web-services xamarin https

我在使用仅通过https提供的网络服务时遇到了一些困难。

我已经阅读过其他几个有关实现此问题的人的帖子,但到目前为止我所看到的答案都没有为我解决问题,所以我会尝试在这里解释我的问题并希望一些你知道怎么克服这个障碍。

我正专门为Android开发Xamarin Studio 6.1.1。 我已将项目“Android Build”下的“HttpClient Implementation”设置为“AndroidClientHandler”(这似乎是最新的实现,应该支持TLS 1.2)。

我已经向Web服务添加了一个Web引用(而不是WCF)并在提示时提供了登录信息...到目前为止,一切都按预期进行。

注意:我已经从Visual Studio中的控制台应用程序测试了Web服务,它按预期工作。

但是,当我尝试调用Web服务的某个方法时,我得到了同样的错误,我可以看到很多其他人在我面前遇到的这个错误: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

1 个答案:

答案 0 :(得分:1)

可能的已知错误。在此搜索" https":https://releases.xamarin.com

  

[Mono],[Xamarin.iOS],[Xamarin.Android],[Xamarin.Mac] - 43566 -   “TrustFailure(身份验证或解密失败。)...无效   从服务器收到的证书。“with”错误代码:0x5“或”错误   代码:0xffffffff800b010f“尝试访问HTTPS服务器时   除443以外的其他港口

错误参考:https://bugzilla.xamarin.com/show_bug.cgi?id=44708