【问题标题】:SSL client certificates / mutual authentication with ServiceStack (HttpListener)SSL 客户端证书/与 ServiceStack (HttpListener) 的相互身份验证
【发布时间】:2014-03-05 15:33:31
【问题描述】:

我正在尝试使用 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 来验证服务器证书?

【问题讨论】:

    标签: c# ssl servicestack httplistener


    【解决方案1】:

    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;
    

    不确定这是否是推荐的方法(或者确实有推荐的方法,但它对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-14
      • 2015-12-26
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多