0

我一直在谷歌上寻找解决方案,但一无所获。我有一个用 C# 编写的 REST 服务(使用 WebServiceHost 类),我正在尝试完成一个简单的任务:使用证书对服务器和客户端进行相互身份验证,无需加密、SSL 或 HTTPS,仅通过 HTTP要求。

目前我可以使用网络浏览器访问http://localhost:8000/MyService/Items/abc并从服务器获得响应,但我无法让服务器要求使用证书进行身份验证。我能做的最好的事情是让服务器要求用户使用 AD 用户名和密码来识别自己。

编辑:
正如(另一个)Avi 解释的那样 - 由于协议不发送或接收证书,因此不可能通过 HTTP 进行自动证书验证。唯一可行的方法是编写自己的“类 SSL”协议,该协议在 HTTP 上工作,这将使来回调用的数量增加一倍,并且在所有可能的方面都不如内置的 SSL/TLS .

4

1 回答 1

1

您是否使用 .net 客户端调用 Rest 服务?如果是,您可以将证书附加到 HttpWebRequest 请求。request.Certificates.Add(证书)。 检查此链接以配置服务器以进行客户端证书请求

您需要启用 ssl 以选择需要客户端证书。其他选项是接受证书,在这种情况下,它将允许用户访问资源,如果客户端不提供证书,您需要提供其他方式来验证用户。所有这些仅在从复杂的框架(如 .net/Java)访问时才有效。如果您尝试从 javascript 访问,我认为您无法附加客户端证书。只有浏览器可以发送客户端证书(需要客户端证书设置)作为正常 http 请求的一部分。

我提到的任何选项都需要 ssl 通信。仅使用 HTTP,您不能拥有客户端证书。假设您仅使用 .net 客户端第一个请求 - 将客户端证书发布密钥发送到服务器。服务器通过查找公钥来判断服务器中是否存在证书。只有有效的用户公钥证书存储在服务器中。如果存在,则将令牌(比如说 345)发送给客户端。客户端对令牌进行签名并发送签名数据(令牌 345 + 加密令牌 876)。服务器获取令牌的公钥(存储在第一个请求中)并验证签名(解密 876 并与令牌进行比较)。如果它们匹配,则验证请求其他无效。

这只是为了了解如何为每个请求设置身份验证。为什么你不应该使用它 - 你最终会收到 2 个不好的调用请求。- 您需要检查有效性以及证书是否有效(它没有被 CA 撤销)所以基本上你最终会像 ssl 通信(减去加密请求/响应本身需要加密令牌)

简而言之,如果没有 ssl,您将无法拥有客户端证书身份验证机制

于 2013-07-26T01:12:08.740 回答