🔗 功能:SSL服务器证书验证器
- 目标:允许外部代码执行超越OpenSSL验证的SSL/TLS服务器证书检查。
- 状态:已完成。
- 版本:v3.4
- 开发者:AlexRousskov
- 更多:如果没有SslBump则不需要。
🔗 动机
受DigiNotar CA 泄露事件的启发,各种Web代理现在都在努力验证SSL证书(请参阅2011年标题为“SSL Bump Certificate Blacklist”的squid-dev线程,以获得良好介绍)。从用户的角度来看,SSL嗅探(SSL bumping)的Squid是服务器证书验证的最终权威,因此我们也需要超越基本的OpenSSL检查。
各种协议和其他验证方法正在涌现:CRL、OCSP、SCVP、DNSSEC DANE、SSL Notaries等。目前还没有明显的赢家,所以我们处于通过试错进行本地实验的阶段。我们认真考虑过在Squid中实现上述方法之一,但似乎最好改为支持一个通用的验证助手(helper),以便管理员可以尝试不同的方法。
🔗 实现草图
将在我们现在进行的内部OpenSSL验证之后,可选地咨询该助手,无论该验证结果如何。助手将接收
- 源服务器证书[链],
- 目标域名,以及
- OpenSSL验证错误列表(如果有)。
如果助手决定接受OpenSSL错误或报告其他验证错误,助手将返回
- 验证错误名称(请参阅%err_name错误页面宏和%err_details logformat代码),
- 错误原因(%ssl_lib_error宏),
- 有问题的证书(%ssl_subject和%ssl_ca_name宏),以及
- 所有其他发现的错误列表
返回的信息模仿了当前内部基于OpenSSL的验证代码收集的内容。任何返回的错误将被馈送到sslproxy_cert_error,触发现有的SSL错误处理代码。
助手响应将被缓存,以减轻验证性能负担(按验证查询参数索引)。
🔗 助手通信协议
此接口与SSL证书生成接口类似。
Squid接收的输入行
request size [kv-pairs]
line 指的是一个逻辑输入。body 可能包含 \n 字符,因此此格式中的每一行都以 0x01 字节而不是标准的 \n 字节分隔。
-
- request
- 请求的操作类型。目前,代码cert_validate是唯一的请求。
-
- size
- key=pair参数占用的以下请求字节的总大小。
-
- kv-pairs
- 可选的由换行符分隔的键值对列表。支持的参数有: | — | — | | host | FQDN主机名或域名 | | proto_version | SSL/TLS版本 | | cipher | 使用的SSL/TLS密码套件 | | cert_ID | 服务器证书。ID是此证书的索引号。此参数的数量与服务器证书的数量相同 | | error_name_ID | OpenSSL证书验证错误。ID是此错误的索引号 | | error_cert_ID | 导致error_name_ID的证书的ID |
示例请求
0 cert_validate 1519 host=dmz.example-domain.com
cert_0=-----BEGIN CERTIFICATE-----
MIID+DCCA2GgAwIBAgIJAIDcHRUxB2O4MA0GCSqGSIb3DQEBBAUAMIGvMQswCQYD
...
YpVJGt5CJuNfCcB/
-----END CERTIFICATE-----
error_name_0=X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
error_cert_0=cert0
返回给 Squid 的结果行
result size kv-pairs
-
- result
- 其中一个结果代码
OK 成功。证书已验证。 ERR 成功。证书未验证。 BH 失败。帮助程序遇到问题。
-
- size
- 由key=pair参数占用的以下响应字节的总大小。
-
- kv-pairs
- 由换行符分隔的键值对列表。支持的参数有:
cert_ID 助手发送给Squid的一个证书。ID是此证书的索引号 error_name_ID ID错误的OpenSSL错误名称 error_reason_ID ID错误的根本原因 error_cert_ID 损坏的证书。它可以是助手发送给Squid的一个证书,也可以是Squid发送给助手的一个证书
示例响应消息
ERR 1444 cert_10=-----BEGIN CERTIFICATE-----
MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
...
398znM/jra6O1I7mT1GvFpLgXPYHDw==
-----END CERTIFICATE-----
error_name_0=X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
error_reason_0=Checked by Cert Validator
error_cert_0=cert_10
🔗 设计决策点
为什么应该在OpenSSL验证之后咨询助手?这允许助手使用并可能调整OpenSSL检测到的错误。我们可以添加一个squid.conf选项来控制咨询顺序,但我们找不到一个好的用例来证明其开销是合理的。
为什么即使OpenSSL已经声明证书无效也应该咨询助手?OpenSSL可能出错。例如,它的CRL可能过时或配置不正确。我们可以添加一个squid.conf选项来控制在OpenSSL检测到错误后是否咨询助手,但由于这类错误应该很少见,该选项很可能在罕见的错误情况下不会带来任何功能优势,反而会增加常见情况的开销。
类别:功能
导航:站点搜索,站点页面,类别,🔼 向上