无root权限的OpenNao设备连接Azure TLS1.2服务器报错求助
解决OpenNao(Python 2.7.3)无root权限下连接TLS 1.2服务器的问题
首先,你的推测完全正确——Python 2.7.3本身对TLS 1.2的支持不完善,默认SSL配置不会自动启用该协议,再加上OpenNao的无root环境限制,我们可以用用户空间级别的方案解决问题,不需要升级系统Python或修改系统SSL配置。
下面是具体的解决步骤:
1. 安装Python加密扩展库(优先方案)
Python 2.7.9及以下版本需要额外的库来启用SNI和TLS 1.2支持,这些库可以用pip安装到你的用户目录(无需root):
pip install --user pyopenssl ndg-httpsclient pyasn1
pyopenssl:提供比系统默认SSL更现代的TLS协议支持ndg-httpsclient:让urllib3(requests的底层依赖)能够调用OpenSSL的SSLContextpyasn1:处理证书相关的ASN.1编码,确保证书验证流程正常
2. 修改requests代码强制使用TLS 1.2
安装完库后,需要修改请求代码,强制requests使用TLS 1.2协议。我们可以通过自定义HTTPAdapter来实现:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl # 自定义适配器,强制所有HTTPS请求使用TLS 1.2 class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 ) # 初始化请求参数 url = "www.example-url.com" querystring = {"key":"value"} headers = { 'token': "4bfd740f482d48a3a894445eb6a85a83", 'Username': "user", 'Password':"password" } # 创建session并挂载适配器 session = requests.Session() session.mount('https://', TLS12Adapter()) try: response = session.get(url, headers=headers, params=querystring, timeout=30) # 验证请求状态 print(f"请求状态码: {response.status_code}") print(f"响应内容: {response.text}") except Exception as e: print(f"请求失败: {str(e)}")
这段代码不仅会强制使用TLS 1.2,还能解决之前出现的SNIMissingWarning和InsecurePlatformWarning问题。
3. 验证TLS版本是否生效
你可以运行下面的脚本,确认当前请求使用的是TLS 1.2:
import requests from requests.adapters import HTTPAdapter from urllib3.poolmanager import PoolManager import ssl class TLS12Adapter(HTTPAdapter): def init_poolmanager(self, connections, maxsize, block=False): self.poolmanager = PoolManager( num_pools=connections, maxsize=maxsize, block=block, ssl_version=ssl.PROTOCOL_TLSv1_2 ) session = requests.Session() session.mount('https://', TLS12Adapter()) response = session.get('https://www.howsmyssl.com/a/check') print(f"当前使用的TLS版本: {response.json()['tls_version']}")
如果输出是TLS 1.2,说明配置成功。
备选方案:使用curl命令行工具(如果库安装失败)
如果因为OpenNao的系统依赖问题无法安装上述Python库,可以尝试用系统自带的curl(通常默认支持TLS 1.2),通过Python的subprocess调用:
import subprocess import json url = "www.example-url.com" query_params = "key=value" full_url = f"{url}?{query_params}" # 构造curl命令,强制使用TLS 1.2 curl_command = [ "curl", "-s", full_url, "-H", "token: 4bfd740f482d48a3a894445eb6a85a83", "-H", "Username: user", "-H", "Password: password", "--tlsv1.2" ] try: # 执行curl命令并获取输出 response_output = subprocess.check_output(curl_command) # 解析JSON响应 response_data = json.loads(response_output) print(f"响应数据: {response_data}") except subprocess.CalledProcessError as e: print(f"curl执行失败: {str(e)}") except json.JSONDecodeError as e: print(f"响应解析失败: {str(e)}")
这个方案绕过了Python的SSL限制,直接用curl处理HTTPS连接。
内容的提问来源于stack exchange,提问作者oga
相关产品推荐
相关产品推荐

