【问题标题】:Server certificate/domain custom validation when connecting via TLS/SSL on production在生产中通过 TLS/SSL 连接时的服务器证书/域自定义验证
【发布时间】:2020-01-16 03:36:00
【问题描述】:

当一个网络服务请求被发送到一个远程网络服务时,会出现以下错误:

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上的代码没有解决方案。

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

【问题讨论】:

  • 无法回答这个问题,因为第二个 if 语句不是有效的 C#。我们可以确定这是否“安全”的唯一方法是您是否真的在此处包含您正在使用的实际代码。也就是说,几乎可以肯定你所做的事情并不安全。
  • if 语句是伪代码。我可以更新它以避免混淆。
  • "正确的方法是从客户端使用服务器的公共证书登录" 在一侧SSL的握手过程中,客户端接收服务器的证书,然后默认验证为this微软。双向 SSL 增加了将客户端证书发送到服务器进行验证的步骤。客户端从不发送服务器的证书。就像我在其他地方评论的那样,如果你不学习 ABC,进一步讨论毫无意义。
  • 我获得了服务器的公共证书(.Cer),我不知道客户端证书供客户端使用。
  • 即使您进行了更改,问题也没有变得更清楚。您实现的安全性完全取决于您已省略的IsValidServerCertificateIsValidServerIP。但是,如果 IsValidServerIP 的实现只是根据一些硬编码值检查 IP(这似乎是不可能的,因为您只将证书传递给该方法,而您无法从中确定实际的服务器 IP),那么这种方法绝对是安全的。

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


【解决方案1】:

...鉴于服务器在我们的控制之下,可以安全地在生产环境中使用。将攻击想象成中间人等。

中间人攻击不是针对客户端的攻击,也不是针对服务器的攻击,而是针对中间人的攻击。因此,服务器是否在您的控制范围内都没有关系。只有当客户端和服务器之间的一切都在您的控制之下时,您才能确定不会发生中间人攻击。为了实现这一点,您必须确保客户端甚至使用您控制的路径:诸如 DNS 欺骗之类的东西可能会返回到不同的目标 IP 地址,从而返回与您预期不同的路径。

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

【讨论】:

猜你喜欢
  • 2016-10-20
  • 2016-07-12
  • 2016-06-04
  • 2021-11-11
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多