已配置SSL终止,Apache Traffic Server仍不缓存HTTPS内容求助
问题:ATS正向代理无法缓存HTTPS内容,SSL终止未生效
配置文件
records.config
# records.config CONFIG proxy.config.http.server_ports STRING 8125 8443:ssl CONFIG proxy.config.http.cache.required_headers INT 0 CONFIG proxy.config.url_remap.remap_required INT 0 CONFIG proxy.config.reverse_proxy.enabled INT 0 CONFIG proxy.config.ssl.server.cert.path STRING /usr/local/etc/ssl/ CONFIG proxy.config.ssl.server.private_key.path STRING /usr/local/etc/ssl/ CONFIG proxy.config.ssl.client.certification_level INT 0
ssl_multicert.config
# ssl_multicert.config dest_ip=* ssl_cert_name=fullchain-from-letsencrypt.pem ssl_key_name=key-from-letsencrypt.pem
证书由certbot生成,预期实现SSL终止但未生效。
代理设置与测试
export http_proxy=http://ats.domain:8125 export https_proxy=https://ats.domain:8443; # HTTP请求正常缓存 wget http://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso.zsync # HTTPS请求报错且不缓存 wget https://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso.zsync
wget HTTPS请求报错信息
--2023-08-04 10:38:30-- https://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso.zsync Resolving ats.domain (ats.domain)... 10.147.19.193 Connecting to ats.domain (ats.domain)|10.147.19.193|:8443... connected. Failed reading proxy response: Success Retrying.
curl测试结果
# HTTP请求正常缓存 curl http://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso.zsync > /dev/null # HTTPS请求无报错但不缓存 curl https://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso.zsync > /dev/null
ATS日志
traffic_logcat -f /usr/local/var/log/trafficserver/squid.blog 1691116320.693 6 TCP_HIT/200 3859845 GET http://releases.ubuntu.com/jammy/ubuntu-22.04.2-live-server-amd64.iso.zsync - NONE/- application/x-iso9660-image 1691116855.993 7849 TCP_MISS/200 105 CONNECT releases.ubuntu.com:443/ - DIRECT/releases.ubuntu.com -
可见HTTPS请求采用CONNECT隧道方式,未触发缓存逻辑。
解决方案
核心问题分析
当前HTTPS请求走CONNECT隧道模式,ATS仅作为中转转发加密流量,无法解析隧道内的HTTPS请求内容,因此无法执行缓存。要实现HTTPS缓存,需将ATS配置为MITM(中间人)代理,终止客户端SSL连接、解析请求后再与后端建立连接,同时让客户端信任ATS的CA证书。
具体配置步骤
- 生成ATS专用CA证书
Let's Encrypt证书无法用于MITM代理,需自行生成CA证书:
openssl req -x509 -newkey rsa:4096 -keyout ats-ca-key.pem -out ats-ca-cert.pem -days 3650 -nodes
将生成的ats-ca-cert.pem导入客户端的系统信任存储(如Linux的/etc/ssl/certs、Windows的证书管理器),否则客户端会报SSL证书错误。
- 修改records.config启用SSL拦截
添加/更新以下配置项:
# 启用SSL拦截功能 CONFIG proxy.config.ssl.intercept.enabled INT 1 # 允许ATS自动生成目标站点的签名证书 CONFIG proxy.config.ssl.intercept.cert_generate INT 1 # 指定CA证书和密钥路径 CONFIG proxy.config.ssl.intercept.ca_cert.path STRING /usr/local/etc/ssl/ats-ca-cert.pem CONFIG proxy.config.ssl.intercept.ca_key.path STRING /usr/local/etc/ssl/ats-ca-key.pem # 允许缓存HTTPS内容 CONFIG proxy.config.http.cache.ssl INT 1
- 调整客户端代理配置
将https_proxy指向ATS的HTTP代理端口,而非HTTPS端口:
export http_proxy=http://ats.domain:8125 export https_proxy=http://ats.domain:8125
此设置会让客户端将HTTPS请求以GET https://xxx的形式发送到ATS,触发SSL拦截逻辑。
- 重启ATS服务
traffic_server -k restart
验证
重新执行HTTPS请求后,查看ATS日志,若出现TCP_HIT或TCP_MEM_HIT,说明缓存生效。
内容的提问来源于stack exchange,提问作者Gahoo
相关产品推荐
相关产品推荐

