将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上的代码中没有解决方案。
我相信,如果可以找到带有代码示例的简单解决方案,那么该票证将来可以使其他人受益。
答案 0 :(得分:2)
...只要服务器处于我们的控制之下,就可以在生产环境中安全使用。像中间人和其他人一样思考攻击。
中间人攻击不是在客户端或在服务器的攻击,而是在中间。因此,服务器是否在您的控制之下根本不重要。如果客户端和服务器之间的所有内容也都在您的控制之下,则只能确保没有中间人受到攻击。为了实现这一点,您必须确保客户端甚至使用您控制的路径:DNS欺骗之类的东西可能会以不同的目标IP地址返回,并因此以与您期望的路径不同的方式返回。
换句话说:无论您是否控制服务器,代码都是不安全的。不应在生产中使用。而不是尝试解决损坏的设置,您应该解决问题的原因。这些通常是证书损坏,链条不完整或信任锚的设置不完整。