我们目前有一组 Web 服务向各种不同的客户端类型和角色公开接口(interface)。

背景:

  • 身份验证通过 SSL 客户端证书验证进行处理。 目前这是在网络服务代码中完成的(不是由 HTTP 服务器)。我们不想使用任何比这更不安全的方案。这篇文章不讨论授权,只讨论身份验证。
  • Web 服务同时讨论 SOAP 和 REST(JSON),我绝对没有兴趣开始讨论这两种方法的优点。
  • 通过网络服务公开的所有操作都是无状态的。

  • 我的问题是每次请求都验证客户端证书很重,很容易在应用服务器上占用CPU时间。我已经尝试将身份验证和应用程序部分分离到不同的物理服务器上以减少负载,但这并不能提高整体调度速度 - 无论在哪里完成,请求仍然需要恒定的时间来进行身份验证。

    我想尝试通过在客户端证书验证成功后生成 HTTP cookie(带有关联的服务器端 session )来限制身份验证的数量,当由客户端提供时,客户端证书验证将被跳过(尽管仍在讨论SSL)。我还想对 session 进行时间限制,并从客户的角度使流程尽可能透明。

    我的问题:
  • 这仍然是安全的吗? (以及我们如何优化安全性和实用主义?)
  • 这个方案有免费的实现吗? (我知道 CA 的 SiteMinder 产品)
  • 综上所述,我们应该继续在应用程序中进行身份验证,还是转移到服务器内?
  • 最佳答案


    它在理论上并不那么安全,因为服务器无法再向自己证明没有中间人。
    当客户端提供客户端证书时,服务器可以加密信任它。客户端和服务器应该基于客户端的 key 加密和数据(好吧, session key )。在没有客户端证书的情况下,服务器只能希望客户端已经很好地验证了服务器的证书(如客户端所认为的),并通过这样做消除了 MitM 先生的可能性。
    开箱即用的 Windows 客户端信任 200 多个根 CA 证书。在没有客户端证书的情况下,服务器最终会通过扩展信任。
    这是一篇关于在数据包捕获中查找内容以验证客户端证书是否提供针对 MitM 的防御的好文章:
    http://www.carbonwind.net/ISA/ACaseofMITM/ACaseofMITMpart3.htm
    这种类型的中间人的解释。
    http://www.networkworld.com/community/node/31124
    这种技术实际上被一些防火墙设备用于对 SSL 进行深度检查。
    MitM 过去看起来像是一个大型的 Mission Impossible 风格的制作,需要花费很多时间才能完成。真的,尽管在此过程中的任何地方都只需要一个受损的 DNS 解析器或路由器。世界上有很多 Linksys 和 Netgear 小盒子,其中可能有两三个没有最新的安全更新。
    在实践中,这对于主要金融机构的网站来说似乎已经足够了,尽管最近的证据表明他们的风险评估策略不太理想。

    只是一个客户端cookie,对吧?这似乎是每个 Web 应用程序框架的一个非常标准的部分。

    硬件加密加速器(SSL 代理前端或加速器卡)可以显着加快速度。
    将证书验证移至 HTTP 服务器可能会有所帮助。无论如何,您可能会在加密数学中进行一些重复。
    看看您是否会受益于客户端证书上更便宜的算法或更小的 key 大小。
    验证客户端证书后,您可以尝试在短时间内缓存它的哈希摘要(甚至整个内容)。这可能会使您不必在每次点击时在信任链上一直重复签名验证。
    您的客户多久进行一次交易?如果构成您的大部分交易的交易频繁出现,您可以说服他们在单个 SSL 协商/身份验证中组合多个交易。查看设置 HTTP Keep-Alive header 。他们可能已经在某种程度上这样做了。也许您的应用程序正在对每个 HTTP 请求/响应进行客户端证书验证,或者仅在每个 session 开始时进行一次验证?
    无论如何,这些都是一些想法,祝你好运!

    关于performance - SSL 客户端证书验证优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1193013/

    10-12 00:31
    查看更多