5

我正在尝试发送请求:

ActiveXObject("WinHttp.WinHttpRequest.5.1")

但是,这需要客户端证书(我们已经提供)。

在 PHP cURL 中测试后,我可以这样做:

curl_setopt($SOAP, CURLOPT_SSLCERT,$filepathtocertificate);

哪个工作正常。但是我必须使用运行 asp(javascript) 的 IIS 并指向运行脚本的机器的证书存储:

 SetClientCertificate("LOCAL_MACHINE\\Personal\\Certificate subject");

用于我们的实际部署。MS 文档(http://msdn.microsoft.com/en-us/library/windows/desktop/aa384055(v=vs.85).aspx)建议上面的路径必须说明证书的“主题” ,但是证书似乎有几个主题,并且没有几个或所有主题的组合似乎产生任何结果,甚至在发送请求之前我就遇到了以下错误:

WinHttp.WinHttpRequest error '80072f0c'

A certificate is required to complete client authentication

查看证书存储并使用同一文件夹中的其他脚本表明它们肯定存在,但主题如下:

C=US, O=Organisation NAme, OU="Another Organisation Name, Inc.", CN=Organisation Name Root

或类似的。

任何关于需要提供哪些参数 SetClientCertificate 以在证书存储中选择和发送证书的建议将不胜感激。

4

2 回答 2

4

我在同样的问题上遇到了很多麻烦 - 在发送之前使用脚本语言中的 winhttp 5.1 设置客户端证书。

我曾使用带有证书管理单元的 mmc 在 CURRENT_USER \ Personal 中导入证书 - 但 Winhttp SetClientCertificate 似乎没有做任何事情,我也无法获取任何错误代码或消息,所以这是一个案例反复试验和错误 - SetClientCertificate 字符串应该类似于“Location\store\subject”,例如“CURRENT_USER\Personal\My Certificate”(或 \ \,如果您的语言需要转义 \) - 最后一部分是“主题”没有应有的清晰。在 MMC 下,主题被分解为许多元素。

我最终通过删除位置和存储来让它工作 - 它们是默认值,所以我可能很幸运 - 并且只提供主题字段 - 我用于主题字段的值是主题下“CN =”行中的值(当证书在 mmc 下打开时)-但这(可能巧合)也是主 mmc 证书列表上“颁发给”列中的值。就我而言,它起作用了-显然,如果有这两个值不同的证书,那么您需要分别尝试。

如果有人同样陷入困境,希望这会有所帮助。

于 2015-05-09T17:07:08.093 回答
2

这是一个非常古老的问题,但我今天必须找到答案。@JSL 上面提供的答案对我有帮助。如果您只提供证书主题名称,那么它可以工作!因此很明显,指定完整路径的方式存在错误。

我从这个链接https://msdn.microsoft.com/en-us/library/windows/desktop/aa384076(v=vs.85).aspx获得了适用于 Windows 7 的正确信息

这是有效的 VBA 脚本。

Dim objHttp As New WinHttp.WinHttpRequest
objHttp.Open "GET", url, False
objHttp.SetClientCertificate "CURRENT_USER\My\TestCert"
objHttp.send

有效位置是 LOCAL_MACHINE 和 CURRENT_USER,有效商店名称是“MY”、“Root”和“TrustedPeople”。请记住在 C++、C# 等中转义反斜杠。

于 2016-12-15T15:29:28.163 回答