ssl新闻资讯

文档中心

Requests搴撳浣曡幏鍙朒TTPS璇佷功锛熻瑙ython鐖櫕瀹夊叏楠岃瘉鏈哄埗

时间 : 2025-09-27 16:32:17浏览量 : 1

2Requests搴撳浣曡幏鍙朒TTPS璇佷功锛熻瑙ython鐖櫕瀹夊叏楠岃瘉鏈哄埗

作为一名网络安全工程师,我经常需要检查网站的SSL/TLS证书情况。今天我们就来聊聊如何使用Python的requests库获取HTTPS证书信息——这个看似简单但暗藏玄机的操作。

为什么需要获取HTTPS证书?

想象一下你要去银行存钱,首先得确认这家银行是真的吧?HTTPS证书就像是网站的"身份证",告诉我们:"嘿,我是真的某某网站,不是钓鱼的!"

在日常安全工作中,我们可能需要:

- 检查证书是否过期(就像检查身份证有效期)

- 验证证书颁发机构是否可信(就像确认发证机关是不是公安局)

- 查看证书包含哪些域名(就像看身份证上的住址信息)

基础方法:使用requests获取证书

让我们从一个最简单的例子开始:

```python

import requests

import ssl

response = requests.get('https://www.example.com')

cert = ssl.DER_cert_to_PEM(response.raw.connection.sock.getpeercert(binary_form=True))

print(cert)

```

这段代码做了什么呢?

1. 向example.com发起HTTPS请求

2. 从底层socket连接中提取二进制格式的证书

3. 将DER格式转换为PEM格式(更易读的文本格式)

你可能遇到的坑

坑1:requests默认不验证主机名

这是个重要安全知识点!requests默认只验证证书链的有效性,但不会检查证书中的域名是否匹配你访问的网址。这就像有人给你看身份证,你只确认身份证是真的,却不看名字是不是他本人!

危险!即使域名不匹配也会成功

requests.get('https://wrong.host.example.com')

解决方法:

正确做法:开启主机名验证

requests.get('https://www.example.com', verify=True)

verify=True是默认值

坑2:自签名证书问题

企业内部系统常用自签名证书(就像公司自己印的员工卡,不是公安局发的身份证)。这时requests会报错:

会抛出SSLError

requests.get('https://internal.company.com')

两种解决方案:

1. 临时禁用验证(不推荐用于生产环境)

requests.get('https://internal.company.com', verify=False)

2. 添加自定义CA证书(推荐)

requests.get('https://internal.company.com', verify='/path/to/company-ca.pem')

高级技巧:提取详细证书信息

让我们写个实用函数来获取更多细节:

from cryptography import x509

from cryptography.hazmat.backends import default_backend

def get_cert_details(url):

resp = requests.get(url, stream=True)

cert_bin = resp.raw.connection.sock.getpeercert(binary_form=True)

cert = x509.load_der_x509_certificate(cert_bin, default_backend())

return {

'subject': dict(x for x in cert.subject),

'issuer': dict(x for x in cert.issuer),

'serial_number': cert.serial_number,

'not_valid_before': cert.not_valid_before,

'not_valid_after': cert.not_valid_after,

'signature_hash_algorithm': cert.signature_hash_algorithm.name,

}

print(get_cert_details('https://www.google.com'))

这个函数返回的信息包括:

- subject:证书持有者信息(相当于身份证上的姓名、住址)

- issuer:颁发机构(相当于发证机关)

- 有效期:起止日期(防止使用过期证件)

- 签名算法:使用的加密算法类型

安全工程师的专业建议

在实际安全工作中,我会特别注意以下几点:

1. 始终验证主机名

```python

from requests.packages.urllib3.util.ssl_ import create_urllib3_context

创建自定义SSL上下文强制主机名验证

ctx = create_urllib3_context()

ctx.hostname_checks_common_name = True

session = requests.Session()

session.mount('https://', YourAdapter(ctx))

```

2. 监控证书过期时间

def check_cert_expiry(url, warning_days=30):

details = get_cert_details(url)

expiry_date = details['not_valid_after']

remaining_days = (expiry_date - datetime.now()).days

if remaining_days < warning_days:

send_alert(f"证书将在{remaining_days}天后过期!")

3. 检查弱加密算法

def check_weak_cipher(url):

weak_algorithms = ['md5', 'sha1']

if details['signature_hash_algorithm'].lower() in weak_algorithms:

report_vulnerability("发现弱签名算法!")

Web应用安全的延伸思考

通过requests获取和分析HTTPS证书的能力,我们可以构建很多安全工具:

1. 自动化监控系统:定期检查所有业务域名的SSL配置状态

2. 钓鱼网站检测:对比真实网站和可疑网站的证书差异

3. 合规性检查:确保所有服务使用符合PCI DSS等标准的TLS配置

记住一点:在网络通信中,"信任但要验证"是黄金法则。即使是HTTPS连接,也需要仔细检查其背后的认证机制。

希望能帮助你理解Python中处理HTTPS认证的内部机制。如果你有任何安全问题或想了解更深入的技术细节,欢迎留言讨论!

TAG:requests获取https证书,