我有一个黑盒服务,我必须使用返回 xml 的简单休息命令来调用它。
他们向我们颁发了一个证书,该证书必须在 IE 中运行并安装到 IE 的证书部分。根据他们的指示,我将它与整个链一起导出为带有密码的 pfx。
在证书直接颁发到的机器上,代码中一切正常
var certHandler = new WebRequestHandler();
certHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
certHandler.UseDefaultCredentials = false;
var certificate = new X509Certificate2(Properties.Resources.SigningCert, "password", X509KeyStorageFlags.DefaultKeySet | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); //Must be renewed and replaced every year.
certHandler.ClientCertificates.Add(certificate);
//Execute the command
var client = new HttpClient(certHandler);
string result;
try
{
result = await client.GetStringAsync(url);
System.Diagnostics.Debug.WriteLine(result);
}
catch (Exception ex)
{
throw ex;
}
(我已将证书存储在资源中,但它可以正常加载,并且从文件加载它在开发人员机器上也可以正常工作。)我还将它导入服务器上的 IE 以防万一。显然,这可能是在错误的证书存储下,但我无法弄清楚如何在全局范围内加载它。我可以告诉你,相同的 REST GET 在服务器上的 IE 中工作,就像在开发人员机器上一样。它只是在代码中失败。)
在生产中,同样的代码会抛出 403 禁止。
生产(实际上是一个测试版服务器)实际上与开发机器位于相同的 nat 后面,因此他们看到相同的 IP 通过等。
任何想法为什么它会在服务器上而不是在开发人员框中失败?
谢谢!