我正在尝试使用ServiceStack进行相互SSL身份验证,后者使用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
验证服务器证书?
答案 0 :(得分: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;
不确定这是否是推荐的方法(或者确实是推荐的方法,但它适用于我。