我正在使用HttpWebRequest对象通过HTTP POST访问Web服务。的要求,部分原因是,我:HttpWebRequest是否会自动处理证书验证?
- 验证证书中的URL匹配我张贴到
- 的URL验证证书是有效的,值得信赖的
- 验证证书没有过期
HttpWebRequest是否会自动为我处理?我假设如果出现任何这些情况,我会得到标准“无法建立SSL/TLS安全通道的信任关系”例外。
我正在使用HttpWebRequest对象通过HTTP POST访问Web服务。的要求,部分原因是,我:HttpWebRequest是否会自动处理证书验证?
HttpWebRequest是否会自动为我处理?我假设如果出现任何这些情况,我会得到标准“无法建立SSL/TLS安全通道的信任关系”例外。
是的。如果您想禁用此功能,则必须使用this之类的代码。
不是。您仍然需要检查是否使用回调函数返回sslpolicyerror。请确保按照这个使用自签证书的https://rootkit.com/这样的网址测试你的实现。
void InitPhase()
{
// Override automatic validation of SSL server certificates.
ServicePointManager.ServerCertificateValidationCallback =
ValidateServerCertficate;
}
private static bool ValidateServerCertficate(
object sender,
X509Certificate cert,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
{
// Good certificate.
return true;
}
log.DebugFormat("SSL certificate error: {0}", sslPolicyErrors);
bool certMatch = false; // Assume failure
byte[] certHash = cert.GetCertHash();
if (certHash.Length == apiCertHash.Length)
{
certMatch = true; // Now assume success.
for (int idx = 0; idx < certHash.Length; idx++)
{
if (certHash[idx] != apiCertHash[idx])
{
certMatch = false; // No match
break;
}
}
}
// Return true => allow unauthenticated server,
// false => disallow unauthenticated server.
return certMatch;
}
什么是'apiCertHash'? – 2015-06-10 13:24:29
@Oskar Berggren用于证书固定。 – rook 2015-06-16 04:20:07
嗯,是的,但我不明白你在回答这个问题时“不是真的”是什么意思。我相信如果问题中提到的三条规则中的任何一条都被破坏,即使没有回调,SSL策略也会验证连接失败。实际上,回调将用于接受连接,尽管这些检查失败。 – 2015-06-16 08:54:58
任何证据表明它在任何地方都有? – Elazaron 2017-10-25 12:20:44
通过链接的代码,您可以看到验证证书的事件处理程序。在那里添加自己的断点来观察它发生的情况。 – David 2017-10-25 15:43:51