c# ClientCertificates.Add() 证书未附加到 httpwebrequest

标签 c# ssl httpwebrequest x509certificate client-certificates

我正在从插入 USB 读卡器的智能卡中获取自签名 piv auth X509 证书,并通过以下代码将其附加到 HttpWebRequest:

HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(uriInfo);
Request.ClientCertificates.Add(theCert);
Request.Method = "POST";

//get the response back (the mini driver will prompt for a PIN at this point)
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();

让我感到困惑的是,这段代码在某些机器上有效,但在其他机器上却无效。它在一台机器上的 Win7 上工作,而不是在另一台机器上的 Win7 上工作,它在 Win8 上工作。我什至尝试在 Win8 的虚拟机中运行它,它是 Win7 主机的访客,但无法正常工作。

我已经阅读了很多关于堆栈溢出的文章,并尝试了很多不同的方法来让它起作用,但似乎没有任何效果。由于我的证书不包含私钥信息,这似乎就是为什么它不包含在请求中的原因?这类似于这个问题:HttpWebRequest doesn't seem to be sending a client SSL certificate

因为它在某些机器上工作而不在其他机器上工作,我需要在它不工作的机器上进行不同的配置吗?

我知道由于一些 wireshark 调查,证书没有被附加。我使用的证书已在服务器上设置,因此它应该信任它(在某些情况下确实如此)。

我所做的与其他帖子不同的一些事情是我从 piv 智能卡获取证书并将其简单地附加到请求中。当我调用 GetResponse 时,Microsoft 微型驱动程序会提示输入 PIN。但由于证书未附加到请求中,我从未收到输入 PIN 的提示,服务器返回 403 Forbidden 错误。

有什么想法吗?

(这是我的第一篇文章,所以请原谅我犯下的任何罪过)

最佳答案

好吧,我终于找到问题所在了。我注意到当智能卡插入读卡器时,证书没有传播到个人商店。然后我发现负责执行此操作的是名为“证书传播”的服务。

我注意到服务没有运行,当我尝试启动它时,它会立即停止并显示消息,

"The Certificate Propagation service on Local Computer has started then stopped. Some services stop automatically if they are not in use by other services or programs."

在深入研究为什么该服务会启动但无法保持运行后,我发现这是由于注册表中隐藏的组策略设置所致。将以下注册表设置从 0 更改为 1 解决了我的问题:

HKLM\Software\Policies\Microsoft\Windows\Certprop\CertPropEnabled = 1

关于c# ClientCertificates.Add() 证书未附加到 httpwebrequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32895917/

相关文章:

C# View 模型 int 解析错误?到整数

wcf - 通过 Https 自托管 WCF 服务

java - 如何在 POST 请求时在 HTTP header 中设置自定义变量

cookies - SSL 和 cookie 是如何工作的?

google-app-engine - 如何强制谷歌应用引擎使用 https ssl 协议(protocol)?

javascript - 从 javascript 进行 http 调用时失败

http - 在 Firefox 中使用篡改数据篡改 GET 请求参数?

c# - XML - 检查特定节点是否存在

c# - 如何在 Unity (C#) 中将字符串列表转换为单个字符串

c# - 将 XML 字符串添加到 XElement