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

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

将网络服务请求发送到远程网络服务时出现以下错误:

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

我的问题:

1 如果服务器在我们的控制之下,下面的代码结合 TLS/SSL 是否仍然可以安全地用于生产。想想像中间人和其他人这样的攻击。<​​/p>

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" 
   }

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

更新:

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

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

最佳答案

... safe to use on production given the server is in our control. Think of attack like man-in-the-middle, and others.

中间人攻击不是针对客户端或服务器的攻击,而是针对中间人的攻击。因此,服务器是否在您的控制之下根本无关紧要。如果客户端和服务器之间的一切都在您的控制之下,您只能确定不会发生中间人攻击。为了实现这一点,您必须确保客户端甚至使用您控制的路径:DNS 欺骗之类的东西可能会以不同的目标 IP 地址返回,因此路径与您预期的不同。

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

关于c# - 在生产环境中通过 TLS/SSL 连接时的服务器证书/域自定义验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57937520/

相关文章:

c# - 自定义 ConfigurationSection 类型未正确加载

c# - 逆变似乎会导致冲突的行为

python - 如何在 Windows 上更新 SSL 证书?

web-services - 具有特殊字符和 Xauthfile 的 wsimport

c# - 在 IIS 服务器上发布 C# 控制台应用程序

c# - 更改位于 Asp :repeater 内的面板上的 Css 类

c# - Microsoft Enterprise Library 5.0和自定义Powershell cmdlet的问题

c# - IClass 不包含 method_name 的定义,也没有扩展方法 method_name

.net - 控制迭代循环内的递归

php - 尝试通过 PHP 中的 IP(具有已知主机名)连接到 HTTPS 站点,得到 "Peer certificate ... does not match expected CN ..."