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

Android(Kivy)中关闭TLS证书验证无效的技术问题

解决Android(Kivy)环境下geopy Nominatim SSL验证失败问题

你尝试通过设置SSL上下文跳过验证但无效,核心问题在于Android环境中Python的SSL上下文初始化逻辑和桌面端不同,create_default_context()会加载系统默认证书链,即使你手动关闭验证,底层库仍可能触发证书检查。以下是可行的修改方案:

1. 改用原生SSLContext创建无验证上下文

不要使用ssl.create_default_context(),直接从TLS客户端协议初始化上下文,避免加载系统默认证书:

import ssl
from geopy.geocoders import Nominatim

def _locating_place(self, place, country) -> Point:
    if self.ssl_ctx:
        # 直接初始化TLS客户端上下文,不加载默认证书
        ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
        ctx.check_hostname = False  # 禁用主机名检查
        ctx.verify_mode = ssl.CERT_NONE  # 完全禁用证书验证
        # 直接将上下文传入Nominatim实例
        geolocator = Nominatim(user_agent='myapplication', ssl_context=ctx)
    else:
        geolocator = Nominatim(user_agent='myapplication')
    location = geolocator.geocode(f"{place} {country}")

2. 强制指定适配器(可选)

如果上述方法仍无效,可显式指定geopy的HTTP适配器,确保上下文被正确应用:

from geopy.adapters import URLLibAdapter

# 在创建Nominatim时添加adapter_factory参数
geolocator = Nominatim(
    user_agent='myapplication',
    ssl_context=ctx,
    adapter_factory=lambda ssl_ctx: URLLibAdapter(ssl_context=ssl_ctx)
)

为什么之前的方法无效?

ssl.create_default_context()会自动加载系统信任的根证书,在Android的Python构建环境中(比如Buildozer打包的环境),底层OpenSSL库可能会优先使用系统证书存储,导致你设置的verify_mode=CERT_NONE被忽略。而直接用SSLContext(PROTOCOL_TLS_CLIENT)创建的上下文不包含预加载的证书链,再配合禁用验证,才能彻底跳过SSL检查。

注意:这只是临时调试方案,生产环境必须修复证书信任问题(比如添加正确的根证书到Android应用的证书存储),禁用SSL验证会带来安全风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 12:55:34