performance - SSL 客户端证书验证优化

标签 performance web-services authentication ssl-certificate

我们目前有一组 Web 服务,将接口(interface)暴露给各种不同的客户端类型和角色。

背景:

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

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

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

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

    generating an HTTP cookie (with an associated server-side session) after successful client certificate verification, which when supplied by the client will cause client certificate verification to be skipped

    Is this still as secure? (and how can we optimise for security and pragmatism?)


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

    Are there free implementations of this scheme? (I'm aware of the SiteMinder product by CA)


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

    Given the above, should we continue to do Authentication in-application, or move to in-server ?


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

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

    相关文章:

    mysql - MYSQL PRIMARY CHAR KEY 的最大最佳大小是多少

    php - 使用 javascript 和 json 字符串在网页中进行 http 调用

    ruby-on-rails - 如何为我的 rails 应用程序扩展 sidekiq 性能。需要每秒运行 100 个 sidekiq 作业

    java - org.apache.axis2.AxisFault : Transport out has not been set

    ios - 滚动到表格底部时如何添加 "Load more"页面

    http - 错误 403 的 HTTP 规范中的 "authorization will not help"是什么意思?

    java - Android - JDBC 登录

    java - 服务器签名声明 : REST Authentication without server side caching

    performance - 通用 Lisp 类型说明符

    Int32 文字到 float 的 C# 性能损失