【发布时间】: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),我不知道客户端证书供客户端使用。
-
即使您进行了更改,问题也没有变得更清楚。您实现的安全性完全取决于您已省略的
IsValidServerCertificate和IsValidServerIP。但是,如果IsValidServerIP的实现只是根据一些硬编码值检查 IP(这似乎是不可能的,因为您只将证书传递给该方法,而您无法从中确定实际的服务器 IP),那么这种方法绝对是不安全的。
标签: c# .net ssl ssl-certificate tls1.2