使用传输安全性和客户端证书时,无法将数据POST到WCF休息服务

时间:2010-12-14 17:57:48

标签: c# wcf rest

我有一个基于WebHttpBinding的自托管WCF REST服务。该服务的方法之一看起来像这样:

    [OperationContract]
    [WebInvoke(Method = "POST", UriTemplate = "myMethod")]
    Stream MyMethod(Stream contents);

我编写了一个简单的测试程序,它创建了一个HttpWebRequest来尝试将POST数据发送到这个方法。这在以下情况下工作正常:

  1. 服务未使用任何安全措施。
  2. 服务正在使用传输安全,但没有客户端证书。
  3. 服务正在使用带有客户端证书的传输安全,并且我使用POST 0字节。
  4. 如果我尝试使用带有客户端证书的传输安全性超过0字节的POST,该服务将返回HTTP 403(禁止),并且它永远不会访问我的任何代码。

    这让我疯了。

    有什么想法吗?

    更新

    启用http.sys跟踪后,我在跟踪中观察到以下消息:

      

    服务器应用程序尝试接收客户端证书失败,状态为:0xC0000225。

    有谁知道这意味着什么?我确定我正在发送客户端证书,并确定它已被主机信任。

3 个答案:

答案 0 :(得分:0)

您可能需要为本地主机设置SSL证书。

1)运行 - > “MMC”

2)文件 - >添加/删除管理单元...

3)在“可用的管理单元”下,选择“证书”和“添加>”

4)选择“计算机帐户”

5)点击“下一步”

6)点击“完成”

7)点击“确定”

8)查看个人 - >证书我认为你应该有一个127.0.0.1

9)单击该证书并将其拖动到“受信任的根证书颁发机构”

然后,无论您使用何种地址,都需要将该URL更改为127.0.0.1(而不是localhost),因为这不起作用。证书应该是有效的,我认为你将能够获得过去的授权。

如果您遇到其他问题,那么可能不是您的证书,因此请确保您的服务,行为和绑定准确无误。

一种帮助您使用WCF跟踪查看之后可能出现的问题的方法,我将无耻地指向您的博客文章。 :)

http://jtstroup.net/post/Wcf-Tracing.aspx

祝你好运。

答案 1 :(得分:0)

您需要在客户端和服务器中启用安全性

  1. 在服务器上,在Web配置中,您应该设置安全绑定:TRANSPORT和CERTIFICATE

  2. 在客户端创建HttpWebRequest时,还必须启用TRANSPORT和CERTIFICATE。您还应该以编程方式分配客户端证书。

  3. 应打开SSL端口(443) - 通过telnet检查。

  4. 有时IIS会禁用POST动词。你必须启用它

  5. 如果您需要更多详细信息或有问题发布一些代码和web.config文件。

答案 2 :(得分:0)

经过长时间的痛苦搜索,我终于发现问题是一个腐败的客户证书。虽然没有外部指示,但此证书的私钥未保存在本地计算机上。我们在代码中生成证书,然后将其导入当前用户的个人存储区。但是,我们没有在用于生成私钥的对象上设置RSACryptoServiceProvider.PersistKeyInCsp属性。因此,.NET删除了私钥容器,导入的证书最终引用了一个不存在的私钥。

对这篇文章的回复重点介绍了使用.NET导入证书的问题:Inserting certificate with private key