Squid 5.8配置双向TLS(mTLS)失败,求解决方案
问题场景
有一个启用双向TLS(mTLS)的公开API api.example.com,直接使用curl https://api.example.com --cert /path/to/cert --key /path/to/key可正常访问。需要通过Squid代理访问该API,让后端进程无需手动指定证书密钥即可调用,但添加tls_outgoing_options和ssl_bump配置后,测试握手失败,报错OpenSSL SSL_connect: SSL_ERROR_SYSCALL。
核心错误排查
首先注意:你之前的测试命令curl https://api.example.com是直接访问API,并未通过Squid代理,因此Squid的mTLS配置根本没生效。测试必须指定代理地址,命令应为:
curl -x http://[你的Squid主机IP]:[Squid端口] https://api.example.com -v
正确配置步骤
1. 配置Squid客户端mTLS证书
不要拆分tls_outgoing_options指令(拆分后会覆盖前序配置),将证书和密钥写在同一行,可通过ACL指定仅对目标API生效:
# 定义目标API的访问控制列表 acl target_api dstdomain api.example.com # 为该API的出站请求配置客户端证书和密钥 tls_outgoing_options cert=/path/to/client.cert key=/path/to/client.key target_api
如果需要对所有出站HTTPS请求使用该证书,可省略ACL:
tls_outgoing_options cert=/path/to/client.cert key=/path/to/client.key
2. 确保证书文件权限正确
Squid运行用户(通常为squid)必须能读取证书和密钥:
# 更改文件归属 chown squid:squid /path/to/client.cert /path/to/client.key # 密钥权限需严格限制,避免泄露 chmod 600 /path/to/client.key # 证书权限可放宽 chmod 644 /path/to/client.cert
3. 验证证书格式
Squid仅支持PEM格式的证书和密钥,如果你的证书是PKCS#12(.p12)格式,需转换为PEM:
# 提取客户端证书 openssl pkcs12 -in client.p12 -out client.cert -nokeys -clcerts # 提取客户端密钥(-nodes 参数避免设置密码) openssl pkcs12 -in client.p12 -out client.key -nocerts -nodes
4. 移除不必要的ssl_bump配置
ssl_bump用于SSL流量拦截(中间人代理),你的需求是让Squid作为客户端发起mTLS连接,无需拦截流量,因此应删除ssl_bump server-first all配置,避免干扰正常TLS握手流程。
5. 重启Squid并验证
# 重启Squid服务 systemctl restart squid # 查看日志排查问题(日志路径可能因系统不同略有差异) tail -f /var/log/squid/cache.log tail -f /var/log/squid/access.log
完成以上配置后,后端进程只需将代理地址设为Squid的地址,即可自动通过mTLS访问目标API。
内容的提问来源于stack exchange,提问作者Altaz Bhanji

