我们可以使用HttpClient发送未签名的客户端证书吗?

时间:2016-02-28 21:17:20

标签: c# .net dotnet-httpclient

我见过如何使用WebRequestHandlerHttpClient在我的http请求中嵌入证书的代码示例(请参阅下面的代码段)。但是,我刚用自签名证书对此进行了测试,但它无法正常工作。根据{{​​3}},如果没有可信证书,此方法将无效。

如果我通过浏览器或邮递员发送证书,我可以在服务器上看到证书,但不能以编程方式发送。

有人确认或拒绝HttpClientWebRequestHandler执行任何类型的证书验证,然后才能将其作为请求的一部分发送吗?

快速反编译没有显示任何明显的内容,但请求管道中有很多内容在发挥作用。

示例代码:

        var cert = new X509Certificate2(rawCert);


        //This call fails, cannot check revocation authority.
        //Specific error: The revocation function was unable to check
        //revocation for the certificate.
        //X509CertificateValidator.ChainTrust.Validate(cert);

        var certHandler = new WebRequestHandler()
        {
            ClientCertificateOptions = ClientCertificateOption.Manual,
            UseDefaultCredentials = false
        };
        certHandler.ClientCertificates.Add(cert);
        var Certificateclient = new HttpClient(certHandler)
        {
            BaseAddress = new Uri("https://web.local")
        };

        var response = await Certificateclient.GetAsync("somepath");

1 个答案:

答案 0 :(得分:0)

要使用自签名证书,您可以添加using System.Net.Security;

添加处理程序回调方法

public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}

并在调用API之前设置:

ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

见:

https://es.stackoverflow.com/a/153207/86150

https://social.msdn.microsoft.com/Forums/es-ES/130308da-4092-4f21-8355-ee3c77a22f97/llamar-web-service-con-certificado?forum=netfxwebes