在使用HttpWebRequest类向远端URL发送数据时,如果URL为https协议,就会出现异常。因为该url使用了SSL身份验证协议,而它又是依赖于证书的。当然,如果你直接使用浏览器访问该URL,而且之前你已经获取了相关证书并成功导入到自己的证书库中,那么,请求时服务器会自动进行验证。但现在这种情况下,则必须还要多做一些工作。
解决方法是在执行你的代码之前先回调一个名为ServicePointManager的类,每当http客户端的堆栈进行证书验证时,都会检查是否可以回调,如果可以,则执行你你的代码。而要挂接该回调,则必须提供类型RemoteCertificateValidationCallback的一个委托:
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(VerifyServerCertificate);
在回调中,您会获得服务器证书、一个错误代码和一个传入的链对象,然后可以执行自己的检查并返回 true 或 false。如:
private bool VerifyServerCertificate(
object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None) return true;
foreach (X509ChainStatus s in chain.ChainStatus)
{
// allows expired certificates
if (string.Equals(s.Status.ToString(), "NotTimeValid",
StringComparison.OrdinalIgnoreCase))
return true;
}
return false;
}
在2.0以前的版本中,是采用一个叫做CertificatePolicy的接口来实现的。
以上信息来源于MSDN,更多有关支持证书的用法可以访问这里:http://msdn.microsoft.com/zh-cn/magazine/cc163454.aspx#S6