将网络服务请求发送到远程网络服务时出现以下错误:
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/