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

Kivy应用Android平台SSL握手失败问题求助(含日志片段)

解决Kivy Android应用SSL握手失败及SNI缺失问题

你遇到的这个问题非常典型——Windows平台的Python环境默认支持**SNI(Server Name Indication)**和完整的SSL证书链,但Android上通过python-for-android打包的Python2.7环境往往缺少这些支持,导致访问要求SNI的HTTPS站点时出现握手失败。结合你给出的SNIMissingWarning日志,咱们一步步解决:

1. 优先解决SNI缺失问题

日志里的警告已经明确提示SNI不可用,这是握手失败的核心原因之一。你需要为应用添加补全SNI支持的依赖库:

  • 如果用Buildozer打包,修改buildozer.spec的requirements配置行,加入相关库:
    requirements = kivy,requests,pyopenssl,cryptography
    
    打包时python-for-android会自动编译并集成这些库,让你的requests调用能正常发送SNI扩展,满足目标站点的握手要求。

2. 处理证书信任差异问题

Android系统的根证书存储和Windows不同,可能目标站点的证书不在Android默认信任列表里,你可以通过两种方式处理:

  • 安全推荐方案:下载目标站点的CA证书(浏览器导出PEM格式即可),放在应用的资源目录下(比如./certs/),请求时指定证书路径:
    import requests
    
    cert_path = './certs/target_ca.pem'
    response = requests.get('https://your-target-site.com/api', verify=cert_path)
    
  • 临时测试方案:如果只是测试需求,可以临时关闭证书验证(生产环境不推荐,有安全风险):
    response = requests.get('https://your-target-site.com/api', verify=False)
    

3. 强制指定TLS协议版本(可选)

如果目标站点仅支持旧版TLS协议(比如TLS 1.0/1.1),可以手动指定SSL上下文的协议版本适配:

import requests
from requests.adapters import HTTPAdapter
from ssl import PROTOCOL_TLSv1_2

class TLSAdapter(HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        kwargs['ssl_version'] = PROTOCOL_TLSv1_2
        super(TLSAdapter, self).init_poolmanager(*args, **kwargs)

session = requests.Session()
session.mount('https://', TLSAdapter())
response = session.get('https://your-target-site.com/api')

根据目标站点实际支持的版本,调整PROTOCOL_TLSv1_2为对应协议(比如PROTOCOL_TLSv1)。

最后提一句:Python2.7已经停止维护,若条件允许,建议升级到Python3.x,新版本的requests和urllib3默认支持SNI,能从根源避免这类兼容性问题。

内容的提问来源于stack exchange,提问作者NGB

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:57:54