文档中心
Python濡備綍杞绘澗鎼炲畾HTTPS璇佷功锛熺綉缁滃畨鍏ㄨ€侀笩鐨勫疄鎴樻寚鍗?txt
时间 : 2025-09-27 16:30:25浏览量 : 2

****
大家好,我是老王,一个干了10年网络安全的"老司机"。今天咱们聊点既实用又有趣的话题——用Python玩转HTTPS证书。别被专业名词吓到,我会用"说人话"的方式,带你从零开始理解这个技术。(文末有可直接复用的代码片段!)
一、HTTPS证书到底是什么?先讲个故事
想象你要给隔壁村的二狗寄封信。如果直接用明信片(HTTP),全村人都能看见内容;但如果用带锁的铁盒(HTTPS),只有二狗有钥匙能打开。HTTPS证书就是这个"铁盒的合格证明",它确保:
1. 网站身份真实(不是骗子伪装的)
2.传输内容加密(即使被截获也看不懂)
举个实际案例:2025年某电商平台因证书配置错误,导致用户支付页面被中间人攻击,直接损失超500万。
二、Python处理证书的三大实战场景
场景1:快速验证网站证书有效性
```python
import ssl
import socket
def check_cert(hostname):
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
cert = ssock.getpeercert()
print(f"证书有效期至: {cert['notAfter']}")
示例:检查百度证书
check_cert("www.baidu.com")
```
输出结果会显示类似:
证书有效期至: Oct 12 23:59:59 2025 GMT
场景2:自动化监控证书到期(运维必备)
from datetime import datetime
import OpenSSL
def get_expiry_date(host, port=443):
cert = ssl.get_server_certificate((host, port))
x509 = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM, cert)
return datetime.strptime(x509.get_notAfter().decode(), '%Y%m%d%H%M%SZ')
批量检查示例
sites = ["github.com", "twitter.com", "yourdomain.com"]
for site in sites:
days_left = (get_expiry_date(site) - datetime.now()).days
print(f"{site} 还有{days_left}天过期")
场景3:爬虫突破证书验证限制(谨慎使用!)
当遇到自签名证书时:
import requests
??危险操作(仅测试环境使用)
response = requests.get("https://内部测试网站.com", verify=False)
print(response.text)
更安全的替代方案:
response = requests.get("https://内部测试网站.com",
verify="/path/to/company_ca.pem")
三、开发中常见的坑与解决方案
坑1:SSLHandshakeError错误
典型报错:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
解决方案三步走:
1. 更新certifi包:`pip install --upgrade certifi`
2. 指定证书路径:
```python
import certifi
requests.get(url, verify=certifi.where())
```
3. 对于企业内网,可能需要导入内部CA证书
坑2:自签名证书处理
正确姿势是创建自定义上下文:
context = ssl._create_unverified_context()
?不推荐
?推荐做法(允许特定指纹的证书)
fingerprint = "A1:B2:C3..."
def verify_fingerprint(cert):
return cert.fingerprint(sha256) == bytes.fromhex(fingerprint.replace(":", ""))
四、进阶技巧:用Python生成自签名证书
需要安装`pyopenssl`:
```bash
pip install pyopenssl cryptography
生成代码示例:
from OpenSSL import crypto
生成密钥对
key = crypto.PKey()
key.generate_key(crypto.TYPE_RSA, 2048)
创建X509证书
cert = crypto.X509()
cert.get_subject().CN = "yourdomain.local"
cert.set_serial_number(1000)
cert.gmtime_adj_notBefore(0)
cert.gmtime_adj_notAfter(365*24*60*60)
1年有效期
??生产环境必须设置正确的subjectAltName!
关键知识点
| Python模块 | HTTPS相关功能 |
||--|
| ssl | Python标准库的基础SSL支持 |
| requests | HTTP请求时的证书验证处理 |
| pyOpenSSL | CA/客户端双向认证等高级功能 |
| cryptography | RSA/ECC密钥生成与管理 |
最后提醒大家:2025年起所有主流浏览器已强制要求SAN(Subject Alternative Name)扩展字段,没有SAN的证书会被标记为不安全。如果你在开发中遇到奇怪的问题,很可能就是这个问题导致的!
需要完整代码模板的朋友可以评论区留言,我会发你GitHub仓库地址。觉得有用的话别忘了点赞收藏~
TAG:https证书 python,https证书免费申请,https证书查询入口,https证书价格,https证书下载