当颁发者不是 X509Store 受信任的根时使用证书,以使用 Microsoft .NET 框架进行客户端身份验证
Posted
技术标签:
【中文标题】当颁发者不是 X509Store 受信任的根时使用证书,以使用 Microsoft .NET 框架进行客户端身份验证【英文标题】:Use certificate when issuer is not is X509Store trusted roots for client authentication using Microsoft .NET framework 【发布时间】:2014-01-31 18:53:09 【问题描述】:在处理这个问题时,我发现问题与最初陈述的略有不同,因此我正在更改标题和描述
我正在尝试使用我的客户端证书对 WebService 进行身份验证。我为此目的使用WebRequest
。我需要使用自签名证书,无需在 Windows X509 受信任的根存储中注册。
我知道是否提供客户端证书的方法是检查服务器上的请求对象
我尝试使用来自this question 的代码作为指导。它不适用于 .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 得到任何迹象表明握手期间没有使用证书。
如果我将证书放入“受信任的根”,代码将起作用(即使证书不在“个人”中)。
我的问题是:
由于证书在放置在“受信任的根”中时可用,我认为这可能是由于政策或类似的原因。是否可以强制 .NET 在 TLS 协商期间忽略策略设置并使用提供的客户端证书?
如果无法进行上述强制,是否有电话会提前告诉我,我将要使用的证书不可用,将被忽略?或者,如果这样的调用不可用,我是否可以让 WebClient 失败以指示证书错误,而不是静默跳过?
注意:我知道将证书配置为described by Microsoft 将起作用。这不是我要找的。我不想在受信任的根目录中注册可能不安全的证书,因为这存在潜在的安全隐患。我想在客户端上使用证书而不在商店中注册,或者至少获得一个表明证书无法使用的异常。我意识到证书不能用于会话可能有多种原因,但必须有一个例外,或者至少在客户端有某种指示它不能使用指定的证书。相反,客户根本不提供。
【问题讨论】:
如果您从证书存储区读取它,它是否可以在具有相同证书的 .NET 上工作? @WiktorZychla 如果证书存在于“个人”和“受信任的根”中,它就可以工作。如果它在那里,它会工作,无论我是从存储、文件还是资源中读取它。 您确定服务器正在请求客户端证书吗? @galets:您是否尝试使用采用X598KeyStorageFlags
的X509Certificate2
的重载构造函数?特别是,UserKeySet
将证书临时导入用户存储。这听起来像是你的机会,我经常使用它(虽然不是在你的场景中)。
@PeterRitchie 是的,我有 HttpListener,它将在 HttpListenerRequest.GetClientCertificate() 中显示证书。如果证书在客户端机器的x509存储中注册,则证书存在,否则为空
【参考方案1】:
当您实例化您的 X509Certificate2 时,是否设置了 PrivateKey
属性?如果为 null,则您缺少私钥,这意味着 SSL/TLS 客户端将无法对您进行身份验证。
确保您从 PFX 文件(或类似文件)而不是 CER 加载证书。这些也包含私钥。为此,它们通常受密码保护。有关更多信息,请参阅How to retrieve certificates from a pfx file with c#?。
【讨论】:
从 pfx 实例化。存在私钥。同样的事情:我们在这里遗漏了一点。我在这里寻找的是一种能够强制 WebClient 忽略策略并使用我提供给它的任何证书的方法,或者如果它不能使用证书则让它抛出。相反,它现在所做的是默默地拒绝使用证书,除非我查看服务器端,否则我无法知道。如果没有我希望客户抛出的私钥,而不是根本不提供任何证书。任何理由 - 使用证书或抛出,不要表现得像我没有提供一样。以上是关于当颁发者不是 X509Store 受信任的根时使用证书,以使用 Microsoft .NET 框架进行客户端身份验证的主要内容,如果未能解决你的问题,请参考以下文章
通过 SSL 进行 WCF 通信:由于第三方受信任的根证书颁发机构导致的 WCF 访问问题
网络安全配置文件中的固定公钥是不是受信任,即使颁发它的 CA 不是?