Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何将受信任的CA证书(不是客户端证书)添加到HttpWebRequest?_.net_Httpwebrequest_Certificate - Fatal编程技术网

.net 如何将受信任的CA证书(不是客户端证书)添加到HttpWebRequest?

.net 如何将受信任的CA证书(不是客户端证书)添加到HttpWebRequest?,.net,httpwebrequest,certificate,.net,Httpwebrequest,Certificate,我编写了一个C#程序,它使用HttpWebRequest连接到HTTPS站点。GetResponse()方法引发异常: SystemError:基础连接已关闭:无法建立 SSL/TLS安全通道的信任关系 我可以使用curl.exe--cacert-CAFile.pem连接到同一个网站。我希望能够使用来自C#程序的相同可信CA证书 如何获取HttpWebRequest以使用此CA证书文件(或包含从中解析的证书的X509CertificateCollection)请尝试将您的ServerCertif

我编写了一个C#程序,它使用
HttpWebRequest
连接到HTTPS站点。
GetResponse()
方法引发异常:

SystemError:基础连接已关闭:无法建立 SSL/TLS安全通道的信任关系

我可以使用
curl.exe--cacert-CAFile.pem
连接到同一个网站。我希望能够使用来自C#程序的相同可信CA证书


如何获取
HttpWebRequest
以使用此CA证书文件(或包含从中解析的证书的
X509CertificateCollection

请尝试将您的ServerCertificateValidationCallback设置为使用此文件:

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    if (sslPolicyErrors == SslPolicyErrors.None)
    return true;

    X509Chain privateChain = new X509Chain();
    privateChain.ChainPolicy.RevocationMode = X509RevocationMode.Offline;

    X509Certificate2 cert2 = new X509Certificate2(certificate);
    X509Certificate2 signerCert2 = new X509Certificate2(@"C:\MyCACert.PEM");

    privateChain.ChainPolicy.ExtraStore.Add(signerCert2);       
    privateChain.Build(cert2);

    bool isValid = true;

    foreach (X509ChainStatus chainStatus in privateChain.ChainStatus)
    {
        if (chainStatus.Status != X509ChainStatusFlags.NoError)
        {
            isValid = false;
            break;
        }
    }

    return isValid;
}

我没有机会对此进行测试,因此如果遇到任何错误,请告诉我,如果需要,我将修改答案。

我最终实现的解决方案是编写一个使用自定义验证逻辑实现的类:

private X509CertificateCollection   _certs;
private ICertificatePolicy          _defaultPolicy;

public bool CheckValidationResult(ServicePoint svcPoint, X509Certificate cert, WebRequest req, int problem)
{
    if ((_defaultPolicy != null) && _defaultPolicy.CheckValidationResult(svcPoint, cert, req, problem))
    {
        return true;
    }

    foreach (X509Certificate caCert in _certs)
    {
        if (caCert.Equals(cert))
        {
            return true;
        }
    }

    return false;
}
(为了简洁起见,省略了错误检查。)

\u defaultPolicy
可以设置为允许在自定义证书之外使用默认证书存储

\u certs
包含额外的证书。它是通过解析PEM文件并调用
\u certs.Add(新的X509Certificate(Convert.FromBase64String(base64cert)))生成的


CertificatePolicy
已被
ServerCertificateValidationCallback
淘汰,但我需要支持旧版本的.NET。

谢谢,将在明天尝试此操作。此操作不起作用-如果没有根证书,它甚至不会被调用。实际上:如果没有受信任的CA,它在这种情况下也会起作用-但仅当您使用WebClient时: