【发布时间】:2013-05-14 06:13:11
【问题描述】:
我这几天一直在旋转我的轮子,但没有任何进展,到目前为止我在网上找到的建议还没有完全奏效,所以这里是:
我有一个 WCF 服务,它与……不知道你会在另一端调用什么类型的 Web 服务,有点 REST-ish。该方法的 URL 类似于“https://partner.someservice.com/SomeMethod.asp”。我将一些查询字符串 args 塞到它的末尾并将请求 POST 到他们的服务器。
VS 中的错误只显示 403,但是当我使用 Fiddler 时,我看到了 403.7。在将证书导入我的浏览器之前,我也看到了 403.7。我可以检查我的请求对象并查看指定了 [1] 证书的 ClientCertificates,所以我很确定它已被附加。
-
我已将 .pfx 文件导入我的机器和本地用户证书存储区。我已经以多种方式多次运行 winhttpcertcfg 实用程序,基本上是按照我在 MSDN 和 SO 帖子上看到的说明进行的。
winhttpcertcfg -g -c LOCAL_MACHINE\MY -s [cert] -a [user/aspnet/auth'd users]
winhttpcertcfg.exe -i [cert.pfx] -c LOCAL_MACHINE\MY -p [pwd]
我已将 .pfx 文件导入 Chrome。如果我在 Chrome 中点击该 URL,我会提示选择我的证书,然后我可以继续访问该 URL。 IE 中的行为相同。
所以这似乎是特定于我在 VS 中运行的,虽然我不确定我没有检查哪个选项或我没有授予什么权限。在我的 WCF 服务的项目属性下,我尝试了“使用 Visual Studio 开发服务器”和“使用本地 IIS Web 服务器”,但它们的行为相同。我错过了什么?
一些代码:
private static string DoPost(string postData)
{
string result = null;
var httpWebRequest = (HttpWebRequest)WebRequest.Create(GetEndpoint());
var encoding = new ASCIIEncoding();
var bytes = encoding.GetBytes(postData);
httpWebRequest.Method = "POST";
httpWebRequest.ContentType = "application/x-www-form-urlencoded";
httpWebRequest.ContentLength = bytes.Length;
httpWebRequest.ClientCertificates.Add(clientCertificate);
using (var stream = httpWebRequest.GetRequestStream())
{
stream.Write(bytes, 0, bytes.Length);
stream.Close();
using (var httpWebResponse = httpWebRequest.GetResponse())
using (var responseStream = httpWebResponse.GetResponseStream())
{
if (responseStream != null)
{
using (var reader = new StreamReader(responseStream))
{
result = reader.ReadToEnd();
}
}
}
}
return result;
}
以及获取证书的代码(在另一个开发人员编写的实用程序类中,这似乎在生产中工作得很好):
public static X509Certificate2 GetCertificateBySerial(string serial)
{
var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var certColl = store.Certificates.Find(X509FindType.FindBySerialNumber, serial, false);
store.Close();
if (certColl.Count == 0)
{
throw new Exception(String.Format("A certificate with a serial number of \"{0}\" is not installed on the server.", serial));
}
return certColl[0];
}
【问题讨论】:
-
我也会尝试将证书添加到受信任的根证书颁发机构存储中。我认为只要浏览器在导航到 URL 时提示您输入任何内容,您的代码就无法直接连接。
-
感谢您的建议。我尝试将它导入本地计算机和当前用户受信任的根证书颁发机构,但都没有任何效果。
-
嗯 - 我明白了。你可能已经看到了,但是this page 上的 cmets 表明这实际上是服务器上的问题。
-
是的,不过,我不明白为什么我的浏览器很好,而不是通过 VS。 :-(
-
顺便说一句,它也不是过期或撤销的证书。
标签: c# web-services ssl-certificate