我一直在谷歌搜索一个解决方案并且没有任何结果。 我有一个用C#编写的REST服务(使用WebServiceHost类),我正在尝试实现一个简单的任务:使用证书,无需加密,SSL或HTTPS,只通过HTTP对服务器和客户端进行相互身份验证请求。
目前我可以使用网络浏览器访问http://localhost:8000/MyService/Items/abc
并从服务器获得响应,但我无法让服务器请求使用证书进行身份验证。
我能做的最好就是让服务器让用户使用AD用户名和密码来识别自己。
修改
正如(另一个)Avi所解释的那样 - 由于协议不发送或接收证书,因此无法通过HTTP进行自动证书验证。
唯一可行的方法是编写自己的“类SSL”协议,该协议可以通过HTTP工作,这将使来回调用量增加一倍,并且在各方面都不如内置SSL / TLS
答案 0 :(得分:1)
您是否正在使用.net客户端来调用Rest服务?如果是,您可以将证书附加到HttpWebRequest请求。 request.Certificates.Add(certficate)。 check this link for configuring server for client certificate request
您需要启用ssl以选择Require client certificate。其他选项是接受证书,在这种情况下,它将允许用户访问资源,如果客户端不提供证书,您需要提供其他方式来验证用户。 只有从复杂的框架(如.net / Java)访问时,所有这些都是有效的。如果您尝试从javascript访问我不认为您可以附加客户端证书。只有浏览器才能发送客户端证书(需要客户端证书设置)作为正常http请求的一部分。
我提到的任何选项都需要ssl通信。只有HTTP才能拥有客户端证书。 假设您仅使用.net客户端 第一个请求 - 将客户端证书pub密钥发送到服务器。服务器通过查找公钥来查找服务器中是否存在certficate。只有有效用户的公钥证书存储在服务器中。如果存在,则将令牌(假设为345)发送给客户端。 客户端签署令牌并发送签名数据(令牌345 +加密令牌876)。 服务器获取令牌的pub密钥(存储在第一个请求中)并验证签名(解密876并与令牌进行比较)。如果匹配则认证请求其他无效。
这仅用于了解如何根据请求设置身份验证。为什么你不应该使用它 - 你最终会有2个请求,每次通话都不好。 - 你需要检查有效性以及证书是否有效(它没有被CA撤销)所以基本上你最终会像ssl通信一样(减去加密需要加密令牌的请求/响应本身)
简单来说,没有ssl
就不能拥有客户端证书身份验证机制