我有一个使用WS-HTTP绑定和传输安全性(SSL)的WCF服务(内部编写)。我们使用客户端证书和可接受证书的白名单来验证呼叫者(证书是在带外提供给我们的)。因此,我们使用自定义验证器(例如,派生自System.IdentityModel.Selectors.X509CertificateValidator的类)来执行数据库查询以检查白名单。
它适用于以下情况:我们在开发中使用了根证书,由开发团队发布(使用OpenSSL)。在托管我们的WCF服务的服务器上,此根是受信任的(例如,安装在受信任的第三方CA证书库中)。测试客户端配置为显示由此根签名的证书。这种情况符合预期。
在以下情况下不起作用:客户端向服务提供自签名证书。在这种情况下,客户端收到错误消息“HTTP请求被禁止与客户端身份验证方案'匿名'”,并且 - 这是奇怪的部分 - 服务的证书验证器甚至没有运行。我们没有任何机会表示赞许。客户端证书被低于我们的验证器的层拒绝。
如何在我的服务中使用自签名客户端证书?
答案 0 :(得分:0)
你做不到。在WCF中,WS-HTTP传输安全性是SSL。我的错误是由双方之间的SSL协商失败引起的。
此协商的正常情况如下:服务向客户端发送其信任的根证书列表。客户端检查此列表并找到服务器将发现可信并发送的证书。
在我的错误案例中,客户端正在检查服务器列表并确定其证书不受信任。此时,客户端通常会尝试协商匿名访问,这在我的情况下是禁止的,因此协商失败。
即使您使用自定义验证模式,WCF也不支持WS-HTTP绑定+传输安全方案中的自签名客户端证书或由不受信任的CA颁发的证书。它确实支持消息安全性中的这种情况。我怀疑Net.TCP支持这种情况,但没有测试过。