You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

安卓APP经Nginx反向代理SSL握手失败,切回Apache2用TLS正常求助

解决思路分享:Nginx反向代理后安卓应用SSL握手失败(SSL alert number 46)

我之前帮同事排查过几乎一模一样的问题,结合你的日志和测试信息,给你几个优先级从高到低的排查方向:

1. 先检查Nginx的SSL证书链是否完整

这个是最常见的触发SSL alert number 46(证书未知)的原因。虽然Apache可能会自动处理证书链的拼接,但Nginx需要明确配置完整的证书链才能被安卓系统认可:

  • 找到你的域名证书(比如domain.crt)和CA提供的中间证书(比如intermediate.crt),将它们合并成一个完整的证书文件:
    cat domain.crt intermediate.crt > fullchain.crt
    
  • 修改Nginx配置,将ssl_certificate指向这个合并后的fullchain.crt,确保ssl_certificate_key指向对应的私钥文件,保存后重启Nginx。

2. 调整Nginx的TLS协议与加密套件兼容性

你的测试显示应用用的是TLS而非SSLv3,但Nginx默认的协议/套件配置可能和安卓应用的支持范围不匹配:

  • 在Nginx的server块中添加或调整以下配置,先兼容大部分安卓版本,后续再按需精简:
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # 覆盖主流TLS版本,避免只开高版本导致旧安卓无法握手
    ssl_ciphers HIGH:!aNULL:!MD5:!3DES; # 选择安卓系统广泛支持的加密套件
    ssl_prefer_server_ciphers off; # 让客户端优先选择自己支持的套件,提升兼容性
    
  • 重启Nginx后测试应用连接情况。

3. 验证Nginx的SSL配置有效性

openssl工具手动模拟应用的握手过程,确认问题点:

  • 测试TLS 1.2握手(对应你说的应用使用的协议):
    openssl s_client -connect your_domain:443 -tls1_2
    
  • 查看输出中的证书链信息,如果显示“Verify return code: 0 (ok)”说明证书没问题;如果是“certificate unknown”则回到第一步检查证书链。

4. 对比Apache与Nginx的SSL配置差异

既然Apache下应用能正常运行,把两者的SSL相关配置做逐一对比:

  • 重点看证书路径、协议开启范围、加密套件列表这几项,把Apache中能正常工作的配置逻辑映射到Nginx上(注意两者配置指令的差异,比如Apache的SSLCertificateChainFile对应Nginx的ssl_certificate_chain)。

我当时遇到的情况就是证书链不完整,合并fullchain证书后问题直接解决了,你可以先从这个方向入手排查。

内容的提问来源于stack exchange,提问作者b.mazgarov

火山引擎 最新活动