移除自定义客户端 SSL 处理

https://blueprints.launchpad.net/python-glanceclient/+spec/remove-custom-client-ssl-handling

Glance 客户端当前支持通过 –no-ssl-compression 参数禁用 SSL 压缩。本规范建议废弃这种对 SSL 的特殊处理。

注意:这是传输层压缩,而不是应用层(http)压缩。

问题描述

引入自定义 SSL 处理是因为禁用 SSL 层压缩在某些情况下可以提供大约五倍的性能提升。如果没有禁用 SSL 层压缩,图像传输将受 CPU 限制——CPU 将执行 DEFLATE 算法。这通常会将图像传输限制在 < 20 MB/s。当指定 –no-ssl-compression 时,客户端在 SSL 握手期间不会与服务器协商任何压缩算法,这将消除 CPU 瓶颈,并且传输速度可以接近线路速度。

为了支持 ‘–no-ssl-compression’,存在两个完全独立的代码路径,具体取决于该参数是 True 还是 False。当 SSL 压缩被禁用时,我们不会使用标准的 ‘requests’ 库,而是进入基于 pyopenssl 和 httplib 的自定义代码,以禁用压缩。

本规范建议移除自定义代码,因为

  • 维护成本高

例如,添加新的代码(如 Keystone 会话支持)更加复杂

  • 它可能会引入额外的故障模式

我们发现了一些与“自定义”证书检查相关的错误

  • 较新的操作系统会为我们禁用 SSL。

例如,虽然 Debian 7 默认压缩 ‘开启’,但 Debian 8 默认压缩 ‘关闭’。这使得服务器和客户端都更不可能启用压缩。

  • 较新的 ‘requests’ 和 ‘python’ 组合会为我们做到这一点

Requests 在由支持它的 python 版本(>= 2.7.9)支持时会禁用压缩。这使得客户端更有可能开箱即用地禁用压缩。

  • 原则上,也可以在旧版本上做到这一点

如果旧的操作系统/python 组合上安装了 pyopenssl、ndg-httpsclient 和 pyasn1,则 requests 库应在客户端禁用 SSL 压缩。

提议的变更

废弃 ‘–no-ssl-compression’ 选项。移除自定义 http 处理代码,并在指定 ‘–no-ssl-compression’ 时打印警告。

备选方案

  • 不要废弃

不废弃的成本/收益意味着必须为一小部分边缘情况(可以通过其他方式解决)维护自定义代码路径。

  • 添加对 ndg-httpsclient 和 pyasn1 的依赖。

这对于遗留安装来说是一种可能性,但对于绝大多数情况来说,这应该是不需要的。

数据模型影响

REST API 影响

安全影响

证书检查将不再由自定义 glance 客户端代码完成,而是由 ‘requests’ 库完成。我已验证,对于较旧的 python 安装(2.7),requests 库可以正确执行证书检查。

启用 SSL 压缩的系统可能容易受到 CRIME (https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-4929) 攻击。关注安全的安装应该在禁用 SSL 的情况下运行 Glance 服务器。

通知影响

其他最终用户影响

SSL 可能未被禁用。一个新的废弃警告。

性能影响

如果 SSL 未被禁用,用户将遇到性能下降——直到他们使用替代方法禁用它为止。

其他部署者影响

废弃警告。如果合适,将需要使用替代方法禁用 SSL。

开发人员影响

应该简化事情。

实现

负责人

Stuart McLaren

评审人员

Ian Cordasco

工作项

  • 客户端变更

  • (小) nova/cinder 变更

依赖项

测试

默认情况下,网关中 https 测试有限。将进行一些手动功能测试,并启用 https 的 devstack 将被启动。

文档影响

将更新 cli 帮助。任何相关的 .rst 文档也将被更新。

参考资料

之前的努力

https://review.openstack.org/#/c/23424