SSL 防火墙原理(转载)
最近很多站点诸如汤不热、维基等,使用 hosts 方式访问都会返回 ERR_CONNECTION_RESET,即便使用 https 访问也不例外。很明显是防火墙升级了,这里转载了一篇文章,简述了防火墙过滤 ssl 流量的原理。
1.1 非解密方式的流量过滤
必须结合 SNI 和 CN/SAN进行:
1.收到client的 Hello报文后, 提取 SNI, 发起异步查询; 提取失败, 则执行步骤4;
2.收到异步查询结果后, 并根据URL 过滤的策略配置执行相应动作, 如果动作为阻断, 则直接 RST关闭会话, 返回;
3.转发 Client 的报文给服务器侧; 接受服务器侧回复;
4.提取服务器侧证书中的 CN/SAN, 如果与 SNI 匹配或者提取失败, 则放行会话; 否则使用 CN/SAN 进行分类查询(步骤2).
1.2 Outbound过滤过程
用户首先经过 NGFW 与外部服务器建立TCP连接, 然后发出 SSL握手.
1.SSL 代理缓存客户端的握手报文, 如果不需要策略重查, 则执行步骤6; 否则, 使用客户端 Hello中 SNI+IP+Port 进行本地的 SNI_CN 不匹配缓存查询, 则根据缓存的分类信息进行策略重查, 转步骤4; 否则,设置需要 SNI_CN一致性检测, 执行步骤2;
2.使用客户端 Hello中 SNI 进行异步分类查询, 如果提取异常, 转步骤6;
3.收到返回的分类信息后, 发起策略重查;
4.收到策略重查结果, 如果为阻断, 则关闭会话; 如果为不代理, 则执行步骤5; 否则 (代理) 执行步骤6;
5.以 TCP代理的形式, 解析服务器侧证书, 校验 SNI和CN的一致性, 不匹配则使用 CN/SAN 进行分类查询, 执行步骤10; 同时, 上宋握手报文到 NGE, 进行 URL过滤, 并根据 NGE 返回值进行相应处理, 本流程结束;
6.SSL 代理使用客户端Hello报文的SNI /版本信息, 发起服务器侧握手;
7.SSL代理收到服务器证书后, 如果不需要 SNI_CN一致性检测, 则执行步骤9; 否则,检验 SNI 与证书 CN/SAN 的匹配性, 不匹配则使用 CN/SAN 进行分类查询;
8.获得分类查询后, 记录本地 IP/SNI/分类缓存, 进行策略重查, 如果不需要代理, 关闭会话 (下一条流转发), 如果为阻断, 则直接关闭会话, 否则(需要代理), 急需后续步骤;
9.SSL 代理完成与服务器握手后, 使用服务器选择的加密算法即导入的证书与客户端完成握手; 握手完毕(不走步骤10);
10.获得分类查询后, 记录本地 IP/SNI/分类缓存, 进行策略重查, 如果为阻断, 则直接关闭会话; 否则,则继续当前的 TCP代理流程, 尝试退代理. 对于需要代理的情况,下一条流生效.
1.3 inbound 流量过滤
用户首先经过 NGFW 与内部设备建立 TCP 连接, 然后发出 SSL 握手;
1.SSL 代理收到客户端的握手报文后, 坚持客户端Hello中的版本/算法等信息, 检查是否不支持, 不支持则根据配置执行相应动作, 流程结束; 否则执行步骤2;
2.SSL 代理与服务器进行握手, 获得服务器证书, 如果服务证书与导入的服务器证书之一匹配, 匹配则执行步骤3; 否则形成 IP+SNI 表, 后续放行次会话, 当前会话关闭, 流程结束;
3.SSL 代理使用服务器选择的加密算法/导入的证书/配置的版本/算法等与客户端完成握手;
4.握手完毕后, 客户端将应用层数据以明文方式发送到 NGFW 设备;
5.SSL 代理对数据进行解密后进行安全检测, 确认安全后, 重新加密发往服务器侧; 否则, 管理员设置进行告警, 阻断等操作;
6.服务器对收到的SSL 代理发出的加密数据进行响应, 将数据用加密报文发送给 SSL 代理;
7.SSL代理对数据进行解密后进行安全检测, 确认安全后, 重新加密发往客户端; 否则, 管理员设置进行告警, 阻断等操作.
本文为转载,查看原文看这里:原文地址 。
关于 sni 的一些介绍:https://blog.csdn.net/mrpre/article/details/77867439