我正在尝试发送请求:
ActiveXObject("WinHttp.WinHttpRequest.5.1")
然而,这需要客户端证书(我们已提供)。
在PHP cURL中测试后,我可以这样做:
curl_setopt($SOAP, CURLOPT_SSLCERT,$filepathtocertificate);
哪个工作正常。但是我必须使用IIS运行asp(javascript)并指向运行脚本的机器的证书存储:
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的任何建议都将非常感激。
答案 0 :(得分:2)
我在同样的问题上遇到了很多麻烦 - 使用脚本语言中的winhttp 5.1在发送之前设置客户端证书。
我已经使用带有证书管理单元的mmc来导入CURRENT_USER \ Personal中的证书 - 但是Winhttp SetClientCertificate似乎没有做任何事情,也没有能够获取任何错误代码或消息所以它是重复试错的情况 - SetClientCertificate字符串应该类似于“Location \ store \ subject”,例如“CURRENT_USER \ Personal \ My Certificate”(或\ \如果您的语言要求\被转义) - 最后一部分是'主题'不是应该如此清晰。在MMC下,主题分为许多元素。
我最终通过删除位置和存储来实现它 - 它们是默认值,所以我可能很幸运 - 并且仅提供主题字段 - 我用于主题字段的值是“CN =中的值” “在主题下(当证书在mmc下打开时) - 但这(也许巧合)也是主要mmc证书列表中”颁发给“列中的值。在我的情况下,它工作 - 很明显,如果有这两个值的证书不同,那么你需要尝试每个。
希望如果有人被卡住,这会有所帮助。
答案 1 :(得分:0)
这是一个非常古老的问题但我今天必须找到答案。上面由@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#等中转义反斜杠。