文档中心
Requests搴撳浣曡幏鍙朒TTPS璇佷功锛熻瑙ython鐖櫕瀹夊叏楠岃瘉鏈哄埗
时间 : 2025-09-27 16:32:17浏览量 : 1

作为一名网络安全工程师,我经常需要检查网站的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证书,