Visual Studio 2012 + 403.7错误

时间:2013-05-13 16:27:06

标签: c# web-services ssl-certificate

我已经旋转了几天,现在没有取得任何进展,我到目前为止在网上找到的建议还没有完成,所以这里有:

  1. 我有一个WCF服务,它与...不确定你在另一端称为什么类型的Web服务,这是一种REST-ish。方法的URL看起来像“https://partner.someservice.com/SomeMethod.asp”。我将一些查询字符串args塞进到它的末尾并将请求发送到他们的服务器。

  2. VS中的错误只显示403,但是当我使用Fiddler时,我看到了403.7。在将证书导入我的浏览器之前,我也看到了403.7。我可以检查我的请求对象并查看指定了[1]证书的ClientCertificates,所以我很确定它已经附加了。

  3. 我已将.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]

  4. 我已将.pfx文件导入Chrome。如果我在Chrome中点击该网址,系统会提示您选择我的证书,然后我可以继续使用该网址。 IE中的行为相同。

  5. 所以这似乎特定于我在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];
        }
    

1 个答案:

答案 0 :(得分:0)

我做了一些改动,并且能够让它发挥作用。首先,我不得不从GET更改为POST *,这样做我不小心在post数据(oops)中留下了一部分端点/ url。其次,我在httpWebRequest中包含了这个:

httpWebRequest.ProtocolVersion = HttpVersion.Version11;

最后,403.7错误实际上是由Fiddler拦截我的流量引起的。我没有在Fiddler中正确配置此证书,但接下来会有。一旦我关闭了Fiddler并且实际上正确地格式化了我的POST数据,事情就结束了。

*从GET切换到POST与解决这个问题无关,只是一些背景故事。

TL; DR我没有正确格式化我的请求。