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

无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的SSLContext
  • pyasn1:处理证书相关的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:53:26