繁体   English   中英

当发行者不是X509时,使用证书存储使用Microsoft .NET框架进行客户端身份验证的受信任根

[英]Use certificate when issuer is not is X509Store trusted roots for client authentication using Microsoft .NET framework

在处理这个问题时,我发现问题与最初的说法略有不同,所以我正在改变标题和描述

我正在尝试使用我的客户端证书对WebService进行身份验证。 我正在为此目的使用WebRequest 我需要使用自签名证书,而无需在Windows X509受信任的根存储中注册它。

我知道是否提供客户端证书的方法是检查服务器上的请求对象

我试图使用这个问题的代码作为指导。 它不适用于.NET。 这是我的代码:

            var certificate = new X509Certificate2(Properties.Resources.MyCert);
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(host);
            req.ClientCertificates.Add(certificate);
            WebResponse resp = req.GetResponse();
            var stream = resp.GetResponseStream();

我观察到的是,即使req.ClientCertificates确实包含带有有效私钥的证书,该证书也永远不会呈现给服务器。 我没有得到WebClient的指示,即在握手期间没有使用证书。

如果我将证书放入“受信任的根”,则代码将起作用(即使证书不在“个人”中)。

我的问题是:

  1. 由于证书在被置于“受信任的根”时可用,我认为这可能是由于政策或类似的东西。 是否有可能强制.NET忽略策略设置并在TLS协商期间使用提供的客户端证书?

  2. 如果上述强制措施不可能,是否有提前告诉我的电话,我即将使用的证书不可用,将被忽略? 或者,如果此类调用不可用,我是否可以使WebClient失败,指示证书错误,而不是默默地跳过?

注意 :我知道按照Microsoft描述配置证书将起作用。 这不是我想要的。 我不想在受信任的根目录中注册可能不安全的证书,因为这可能存在安全隐患。 我想在客户端使用cert而不在商店注册,或者至少得到一个异常,表明不能使用证书。 我意识到,为什么证书不能用于会话可能有多种原因,但必须有一个例外,或者至少在客户端有某种指示它不能使用指定的证书。 相反,客户只是不提供一个。

实例化X509Certificate2时,是否设置了PrivateKey属性? 如果为null,则表示您缺少私钥,这意味着SSL / TLS客户端将无法对您进行身份验证。

确保从PFX文件(或类似文件)而不是CER加载证书。 这些也包含私钥。 它们通常用于此目的的密码保护。 请参见如何使用c#从pfx文件中检索证书? 了解更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM