Linux环境下Titanium Web Proxy报SSL handshake failure错误如何解决?
问题产生原因
- 代码未显式加载你生成的根证书:Windows环境下Titanium Web Proxy会自动将生成的临时根证书导入当前用户的CA存储,你可能之前运行时已经自动完成了信任配置,因此运行正常;但Linux环境下程序无权限自动修改系统CA存储,你手动安装的是自己生成的根证书,但代码中没有指定Proxy使用该pfx证书,Proxy会自动生成新的临时根证书,客户端不信任该证书导致握手失败。
- 根证书缺少必要扩展字段:你生成的根证书默认没有开启CA签名权限,Linux下OpenSSL对证书校验更严格,无法用该根证书签发伪造的站点证书,导致握手失败。
- TLS版本/加密套件不兼容:Linux系统OpenSSL默认禁用了部分老旧TLS版本和加密套件,若上游服务或客户端仅支持老旧协议,会出现协商失败。
- 权限不足:程序运行用户没有pfx证书读取权限,或Titanium Web Proxy默认的伪造证书缓存目录无读写权限,导致无法生成临时站点证书。
- 上游证书校验失败:现有证书校验逻辑仅在无SSL策略错误时标记证书有效,若上游站点使用自签名、过期证书,Linux系统默认不信任会直接导致握手失败。
排查步骤
- 打印日志确认根证书是否加载成功:在启动Proxy前输出
proxyServer.CertificateManager.RootCertificate的指纹,和你生成的根证书指纹比对,若不一致说明未正确加载自定义根证书。 - 用OpenSSL命令测试握手详情:执行
openssl s_client -connect 目标站点域名:443 -proxy 代理监听IP:代理端口,查看更详细的握手报错信息。 - 检查根证书扩展字段:执行
openssl x509 -in rootCert.crt -text -noout,确认X509v3 Basic Constraints字段为CA:TRUE,X509v3 Key Usage包含keyCertSign权限。 - 校验权限:确认程序运行用户对rootCert.pfx文件有读取权限,对默认伪造证书缓存目录(一般为当前用户目录下的
.titanium文件夹)有读写权限。
修复方案
1. 显式加载自定义根证书
在ProxyService构造函数中添加根证书加载逻辑,替换为你实际的pfx路径和导出时设置的密码:
// 加载自定义根证书 var rootCertPath = "你的rootCert.pfx文件绝对路径"; var rootCertPwd = "你导出pfx时设置的密码"; var rootCert = new X509Certificate2(rootCertPath, rootCertPwd, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); proxyServer.CertificateManager.RootCertificate = rootCert; // 禁用自动信任根证书,你已经手动将证书安装到系统CA存储 proxyServer.CertificateManager.TrustRootCertificate = false;
2. 兼容TLS协议版本
在构造函数中指定支持的TLS版本,按需开启老旧协议支持:
// 支持主流TLS 1.2和1.3版本,如有兼容需要可追加SslProtocols.Tls11、SslProtocols.Tls proxyServer.SupportedSslProtocols = SslProtocols.Tls12 | SslProtocols.Tls13;
3. 重新生成带必要扩展的根证书
新建证书扩展配置文件ext.conf,内容如下:
[req] distinguished_name = req_distinguished_name x509_extensions = v3_ca prompt = no [req_distinguished_name] C = CN ST = 你的省份 L = 你的城市 O = 你的组织名称 CN = 自定义根证书名称 [v3_ca] basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign
用新配置重新生成证书:
openssl genrsa -out rootCert.key 4096 openssl req -x509 -new -nodes -key rootCert.key -sha256 -days 1024 -out rootCert.crt -config ext.conf openssl pkcs12 -export -out rootCert.pfx -inkey rootCert.key -in rootCert.crt -passout pass:你设置的pfx密码
重新执行证书安装命令更新系统CA存储。
4. 调整权限与证书缓存路径
可手动指定伪造证书缓存目录,提前创建目录并给程序运行用户分配读写权限:
// 自定义伪造证书缓存路径 proxyServer.CertificateManager.CachePath = "/var/cache/titanium-proxy/certs";
5. 调整上游证书校验逻辑
若需要兼容自签名、过期的上游站点证书,可修改证书校验逻辑:
private Task onCertificateValidation(object sender, CertificateValidationEventArgs e) { // 调试阶段可直接信任所有上游证书,生产环境建议按需校验 e.IsValid = true; return Task.CompletedTask; }
内容的提问来源于stack exchange,提问作者Dineshkumar T
相关产品推荐
相关产品推荐

