这是CERTIFICATE_VERIFY_FAILED异常的正确解决方案吗?

时间:2019-01-30 00:16:50

标签: c# ssl xamarin xamarin.android lets-encrypt

因此,我目前正在制作Xamarin.Android应用程序,并且有一段时间了,它使用了我制作的REST API与来回数据进行通信。

但是我最近将SSL证书切换到LetsEncrypt,当尝试通过我的应用与我的API通信时,导致了以下异常:

Ssl error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED

我认为这意味着未正确验证。我在下面找到了以下代码段,该代码段仅验证来自我的域的请求并将其传递通过,并且可以正常工作。

但是我的问题是。这样安全吗?这可能会导致一名男子处于中间攻击状态,还是可以吗?

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicy) =>
{
    if (sslPolicy == SslPolicyErrors.None)
        return true;

    if (sslPolicy == SslPolicyErrors.RemoteCertificateChainErrors &&
       ((HttpWebRequest)sender).RequestUri.Authority.Equals("MY_API_DOMAIN"))
        return true;

    return false;
};

2 个答案:

答案 0 :(得分:0)

您解决此问题的方法绝对不安全:只要请求是针对URL中的特定域,您就可以接受任意证书。这意味着中间攻击者中的一个人可以简单地拦截到该特定服务器的所有流量,为您提供自己的假证书并嗅探甚至修改数据,而无需您的应用程序注意。

如果您的服务器在浏览器上正常运行,则您的应用程序/系统很可能不信任“让我们加密” CA,或者(很可能)您的服务器设置不正确,并且未发送所需的中间证书。请对照SSLLabs检查服务器,并查找诸如链条不完整之类的问题。

答案 1 :(得分:0)

我在上面的答案之后发布了这篇文章,尽管有点迟。就我而言,我的证书通过了检查-甚至某些Android设备都可以使用,但是尽管获得了证书安装的通过标记,但问题是服务器问题。

在服务器配置的情况下,您必须支持“转发保密性”,否则在某些Android设备上却会在其他设备正常工作时出现上述错误。

希望这对某人有帮助。