You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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系统默认不信任会直接导致握手失败。

排查步骤

  1. 打印日志确认根证书是否加载成功:在启动Proxy前输出proxyServer.CertificateManager.RootCertificate的指纹,和你生成的根证书指纹比对,若不一致说明未正确加载自定义根证书。
  2. 用OpenSSL命令测试握手详情:执行openssl s_client -connect 目标站点域名:443 -proxy 代理监听IP:代理端口,查看更详细的握手报错信息。
  3. 检查根证书扩展字段:执行openssl x509 -in rootCert.crt -text -noout,确认X509v3 Basic Constraints字段为CA:TRUE,X509v3 Key Usage包含keyCertSign权限。
  4. 校验权限:确认程序运行用户对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:30:00