C#将SSL证书带入X509Certificate并显示“Forbidden”错误

时间:2012-09-29 22:27:05

标签: c# ssl x509certificate

尝试获取某些SSL证书信息时出现问题。

通常,代码工作正常,但在某些情况下,我收到403 Forbidden错误。即使发生这种情况,我也希望获得证书信息。还有一些情况我也会收到无效的登录凭据。

我想获得X509Certificate对象而不管其中任何一个问题。

如果我使用IE浏览它们,它会向我提供证书信息,无论消息如何。

因此,对于示例代码,requestresponse都定义为对象变量,并在调用request之前正确设置getRequest()

如果没有网页错误,此代码可以正常运行,但如果出现错误,则变量responsenull

是否有另一种方法可以将X509Certificate转换为名为cert的对象变量,即使看到这些错误?

老实说,如果我的回复有效,我真的不在乎,我只关心X509Certificate

// callback used to validate the certificate in an SSL conversation
private static bool ValidateRemoteCertificate(
    object sender,
    X509Certificate certificate,
    X509Chain chain,
    SslPolicyErrors policyErrors
) {
    // allow any old dodgy certificate...
    log.write(0, "entering ValidateRemoeCertificate ");
    return true;
}

// getRequest 
private int getRequest()
{
    try {
        log.write(1, "Validating " + webHostName);
        // request.Method = method;
        ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
        response = (HttpWebResponse)request.GetResponse();
        response.Close();
    } catch (Exception w) {
        if (w.Message.Contains("401"))
        {
            log.write(4, "Web Site Authentication Required for " + host + ":" + port);
            return 401;
        }
        else if (w.Message.Contains("403"))
        {
            log.write(4, "Forbidden Access for " + host + ":" + port);
            return 403;
        }
        else
        {
            log.write(4, "Error Reading Web Site " + host + " Port " + port + " " + w.Message);
            return 400;
        }
    }
    return 0;
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

请改用SslStream课程。使用constructor RemoteCertificateValidationCallback代理AuthenticateAsClient,在{{3}}期间调用该代理来检查服务器的证书。