ssl新闻资讯

文档中心

PythonSSL璇佷功鎶ラ敊鍏ㄨВ鏋愪粠鍘熺悊鍒板疄鎴樿В鍐虫柟妗?txt

时间 : 2025-09-27 16:30:17浏览量 : 2

SSL证书是什么?为什么Python会报错?

2PythonSSL璇佷功鎶ラ敊鍏ㄨВ鏋愪粠鍘熺悊鍒板疄鎴樿В鍐虫柟妗?txt

SSL证书就像网络世界的"身份证",它保证了我们访问网站时的安全性。当你用Python程序访问HTTPS网站时,Python会像严格的安检员一样检查对方的SSL证书是否合法有效。如果发现问题,就会抛出SSL证书错误。

举个生活中的例子:你去银行办业务,工作人员会要求你出示身份证并仔细核对。如果身份证过期了、照片和你本人不符、或者发证机关不被认可,银行就会拒绝为你服务。Python的SSL验证也是类似的机制。

常见Python SSL证书错误类型及原因

1. SSL: CERTIFICATE_VERIFY_FAILED

这是最常见的错误,相当于Python说:"这个网站的身份证有问题!"

```python

import requests

response = requests.get("https://expired.badssl.com")

```

运行这段代码就会遇到这个错误,因为badssl.com提供的测试证书已经过期。

2. SSLError: hostname doesn't match

这种情况就像身份证上的名字和持证人实际名字不符:

response = requests.get("https://wrong.host.badssl.com")

这个测试网站的证书是为"badssl.com"颁发的,但我们访问的是"wrong.host.badssl.com",主机名不匹配。

3. SSL routines:unsafe legacy renegotiation disabled

这表示服务器使用了不安全的老旧SSL协议版本:

import urllib.request

urllib.request.urlopen("https://tls-v1-0.badssl.com:1010")

类似使用过期的门禁卡进入大楼,现代系统出于安全考虑会拒绝这种连接。

5种实战解决方案(附代码)

方案1:临时禁用验证(仅限测试环境)

就像疫情期间临时使用健康码截图(不安全但应急):

response = requests.get("https://expired.badssl.com", verify=False)

??警告:这会让你容易受到中间人攻击!

方案2:添加自定义CA证书

好比公司内部使用的门禁卡系统:

response = requests.get("https://internal.company.com",

verify="/path/to/company_ca.pem")

适合企业内网开发环境。

方案3:更新Python的根证书库

相当于更新你的身份证识别器数据库:

安装certifi包

pip install --upgrade certifi

使用更新后的证书库

import certifi

import ssl

context = ssl.create_default_context(cafile=certifi.where())

response = requests.get("https://example.com", verify=context)

方案4:自定义SSL上下文配置

像调整安检仪的灵敏度:

context = ssl.create_default_context()

context.check_hostname = False

不检查主机名匹配

context.verify_mode = ssl.CERT_NONE

不验证证书

conn = http.client.HTTPSConnection("expired.badssl.com", context=context)

conn.request("GET", "/")

方案5:捕获并处理特定异常

类似机场安检的分级处理机制:

from urllib.request import urlopen

from ssl import CertificateError, SSLError

try:

response = urlopen("https://self-signed.badssl.com")

except CertificateError as e:

print(f"证书问题:{e}")

这里可以添加自定义处理逻辑或回退方案

except SSLError as e:

print(f"SSL协议问题:{e}")

HTTPS请求最佳实践清单

1. 生产环境永远不要禁用验证 - HTTPS的核心价值就是验证身份和数据加密

2. 定期更新依赖库 - Python、requests、certifi等都应保持最新版本:

```bash

pip install --upgrade python requests certifi urllib3 pyopenssl cryptography

```

3. 企业环境统一管理CA - 通过配置文件或环境变量设置:

```python

export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt (Linux/Mac)

set REQUESTS_CA_BUNDLE=C:\path\to\ca-bundle.crt (Windows)

4. 关键操作添加重试机制

from urllib3.util.retry import Retry

retry_strategy = Retry(

total=3,

status_forcelist=[500,502,503,504],

allowed_methods=["GET"]

)

adapter = HTTPAdapter(max_retries=retry_strategy)

session.mount("https://", adapter)

5. 监控和日志记录

```python

import logging

logging.basicConfig(level=logging.DEBUG)

try:

response = session.get(url)

response.raise_for_status()

except Exception as e:

logging.error(f"请求失败: {str(e)}")

sentry_sdk.capture_exception(e)

raise CustomNetworkError from e

Python各版本SSL支持情况对比表

| Python版本 | OpenSSL版本 | TLS1.3支持 | SNI支持 | Certifi默认 |

||-|||-|

| <=2.7 | <=1.0.x | ? | ? | ? |

| ==3.6 | >=1.0.x | ? | ?? | ?? |

| ==3.7 | >=1.1.x | ?? | ?? | ?? |

| >=3.8 | >=1.1.x | ?? | ?? | ?? |

如果你的应用需要兼容老旧系统,考虑使用如下兼容层代码:

```python

from urllib.request import urlopen

except ImportError:

from urllib2 import urlopen

import ssl

_has_ssl = False

else:

_has_ssl = True

if not _has_ssl:

raise RuntimeError("需要SSL支持")

TLS握手过程详解(为什么需要验证)

当你的Python程序连接HTTPS网站时,背后发生了这些事:

1?? Client Hello - "你好,我支持TLS1.2和TLS1.3"

2?? Server Hello - "好的,我们用TLS1.2吧"

3?? Server发送证书链 - "这是我的身份证和签发机构证明"

4?? Client验证:

- ? 检查有效期(不在过去或未来)

- ? CRL/OCSP吊销状态(没被挂失)

- ? CN/SAN匹配域名(姓名正确)

- ? CA是否受信任(发证机关可信)

5?? Master Key交换 - "现在可以安全通信了"

整个过程就像入职前的背景调查+保密协议签署流程。

TAG:python ssl证书报错,ssl module in python is not,python ssl certificate,python ssl模块详解,pythonssl证书验证错误