使用HttpWebRequest类时的SSL支持

来源:互联网 发布:阿里云邮箱怎么样 编辑:程序博客网 时间:2024/05/13 00:49

在使用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

原创粉丝点击