我们能否使用HttpClient发送未签名的客户端证书?

4
我看过如何使用WebRequestHandlerHttpClient嵌入证书到我的http请求的代码示例(请参见以下片段)。但是,我刚刚用自签名证书测试了一下,它并没有起作用。根据这篇文章,如果没有受信任的证书,这种方法将不起作用。
我可以通过浏览器或Postman发送证书并在服务器上看到它,但无法以编程方式实现。
有人能否确认或否认在将其作为请求的一部分发送之前,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");

你可以发送任何东西,但是接收者不会信任未签名的内容。 - Lex Li
你个人验证过那个说法吗?我观察到的代码示例行为并不是那样(也不是我发布博客的作者观察到的行为)。如果你已经能够这样做,那么我们的假设是错误的,问题就在别处--然而,使用可信证书是博主的一个解决方案。 - Mauricio Aviles
自签名证书本身是不可信的。你只是想使用HTTPS协议进行通信,但并不以可信的方式传递客户端的身份吗?还是你想要使用内部签名证书来构建解决方案(而不是由CA签名的)?如果是前者,并且您控制Web服务器,则可以(根据所使用的Web服务器)告诉它忽略客户端身份验证。如果是后者,那么您需要将签名证书(可以是客户端证书本身)放置在Web服务器的证书存储中。如果您无法控制Web服务器,那么就没有办法了。 - Χpẘ
我想让开发变得简单。在开发过程中,我应该能够使用自签名证书。 - Mauricio Aviles
@MauricioAviles 自签名证书在开发中很常见,我个人也使用过。在开发人员的机器上配置它们很容易,但除非手动配置,否则其他机器将不信任它们。这就是我的意思。生成证书的方式和配置证书的方式非常重要,但你描述得太少了。这使得帮助你变得不可能,因为没有人能触及你的机器,只有你自己可以操作。 - Lex Li
在这种情况下,自签名证书是由一个被开发机器信任的根授权机构颁发的。然而,X509CertificateValidator.ChainTrust.Validate(cert) 失败了,因为它无法联系该证书的吊销机构。我会将这些信息添加到问题中,感谢您指出。 - Mauricio Aviles
1个回答

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接