2014-03-05 94 views
2

我试图使用ServiceStack进行相互SSL身份验证,后者使用HttpListenerSSL客户端证书/与ServiceStack(HttpListener)的相互认证

我使用这个命令的服务器到服务器证书所需的端口绑定,并启用客户端证书:

netsh http add sslcert ipport=0.0.0.0:1234 certhash=5d51087438cbea33f2a4d86214b11a866876b9c5 appid={00000000-1111-2222-3333-444444444444} clientcertnegotiation=enable

如果我运行此命令我可以证实,它说Negotiate Client Certificate : Enabled

netsh http show sslcert

然后,添加使用的命名空间保留:

netsh http add urlacl url=https://+:1234/ user="NT AUTHORITY\NETWORK SERVICE"

'正常'服务器认证似乎正常工作;客户端正在接收服务器的证书,我可以使用ServicePointManager.ServerCertificateValidationCallback来覆盖可信的内容。

但是,如果客户端没有发送客户端证书,它将正常工作。如果客户端发送客户端证书(无论服务器是受信任还是不信任),它仍然可以正常工作。这当然是不正确的!

我使用HttpWebRequest.ClientCertificates.Add(X509Certificate)添加客户端证书。

我已经看了一下线路上的流量,而AFAICS服务器正在发送一个可信CA列表并请求客户端证书。

我是否需要重写服务器上的某些内容来验证客户端发送的证书,类似于客户端如何使用ServicePointManager.ServerCertificateValidationCallback来验证服务器证书?

回答

3

ServiceStack允许您配置可拦截所有请求的“全局过滤器”。

我解决了使用全局过滤我的问题:

public static void Validate(IRequest request, IResponse response, object message) 
{ 
    var httpRequest = ((ListenerRequest)request).HttpRequest; 
    var consoleCert = httpRequest.GetClientCertificate(); 
    ... 

然后我就可以送403,如果客户端证书不存在或无效:

response.StatusCode = 403; 
response.EndRequest(); 
return; 

不知道这是推荐方法(或者确实如果有推荐的方法,但它适用于我。