在生产中通过TLS / SSL连接时的服务器证书/域自定义验证

时间:2019-09-14 16:50:51

标签: c# .net ssl ssl-certificate tls1.2

将Web服务请求发送到远程Web服务时,会发生以下错误:

Could not establish trust relationship for the SSL/TLS secure channel
The remote certificate is invalid according to the validation procedure.

我的问题:

1如果服务器在我们的控制范围内,下面的代码与TLS / SSL结合使用仍可以在生产上安全使用吗?像中间人和其他人一样思考攻击。

2如果服务器不在我们的控制范围内,验证可以证明是安全的吗?

System.Net.ServicePointManager.ServerCertificateValidationCallback += delegate (
    object sender,
    X509Certificate cert,
    X509Chain chain,
    SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    {
        return true;   //Is valid
    }

    //validate Server's certificate or Server's domain name or IP
    if (IsValidServerCertificate(cert) || 
        IsValidServerIP(cert))
    {
        return true;
    }

    return false;
};

   public bool IsValidServerCertificate(X509Certificate cert){
    return cert.GetCertHashString() == "server's public certificate thumbprint")
   }
    public bool IsValidServerIP(){
     //compare server's ip address from the request with the address we are given" 
   }

正确的方法是从客户端使用服务器的公共证书登录,但是此方法提供哪些验证需要添加我的自定义验证?

更新

谁对票投了反对票:如果您知道解决方案,为什么不能提供。 SO上的代码中没有解决方案。

我相信,如果可以找到带有代码示例的简单解决方案,那么该票证将来可以使其他人受益。

1 个答案:

答案 0 :(得分:2)

  

...只要服务器处于我们的控制之下,就可以在生产环境中安全使用。像中间人和其他人一样思考攻击。

中间人攻击不是在客户端或在服务器的攻击,而是在中间。因此,服务器是否在您的控制之下根本不重要。如果客户端和服务器之间的所有内容也都在您的控制之下,则只能确保没有中间人受到攻击。为了实现这一点,您必须确保客户端甚至使用您控制的路径:DNS欺骗之类的东西可能会以不同的目标IP地址返回,并因此以与您期望的路径不同的方式返回。

换句话说:无论您是否控制服务器,代码都是不安全的。不应在生产中使用。而不是尝试解决损坏的设置,您应该解决问题的原因。这些通常是证书损坏,链条不完整或信任锚的设置不完整。