【问题标题】:Visual Studio 2012 + 403.7 ErrorVisual Studio 2012 + 403.7 错误
【发布时间】:2013-05-14 06:13:11
【问题描述】:

我这几天一直在旋转我的轮子,但没有任何进展,到目前为止我在网上找到的建议还没有完全奏效,所以这里是:

  1. 我有一个 WCF 服务,它与……不知道你会在另一端调用什么类型的 Web 服务,有点 REST-ish。该方法的 URL 类似于“https://partner.someservice.com/SomeMethod.asp”。我将一些查询字符串 args 塞到它的末尾并将请求 POST 到他们的服务器。

  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 中点击该 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


【解决方案1】:

我进行了一些更改,并且能够使其正常工作。一方面,我不得不从 GET 更改为 POST*,这样做时我不小心将端点/url 的一部分留在了发布数据中(哎呀)。其次,我将它包含在我的 httpWebRequest 中:

httpWebRequest.ProtocolVersion = HttpVersion.Version11;

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

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

TL;DR 我的请求格式不正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2013-01-15
    相关资源
    最近更新 更多