文档中心
Python瀹炴垬3绉嶆柟娉曡交鏉句笅杞紿TTPS璇佷功锛堥檮浠g爜绀轰緥锛?txt
时间 : 2025-09-27 16:30:38浏览量 : 1

作为网络安全从业者,我经常需要分析网站的HTTPS证书。今天就用大白话教你用Python轻松搞定证书下载,再手把手带你分析证书里的关键信息。文末还会分享一个我工作中遇到的真实案例——如何通过证书信息发现钓鱼网站!
一、为什么要下载HTTPS证书?
想象你要租房,房东给你看房产证(HTTPS证书),你需要确认:
1. 证是真的(CA机构签发)
2. 房主和房东是同一人(域名匹配)
3. 证件没过期(有效期验证)
比如访问`https://bank.com`时,如果证书显示颁发给`hacker.com`,就像房东拿着别人的房产证,绝对有问题!
二、Python下载证书的3种方法
方法1:用requests库直接获取(最简单)
```python
import requests
response = requests.get('https://www.baidu.com', timeout=5)
cert = response.raw.connection.sock.getpeercert()
print("颁发给:", cert['subject'][0][0][1])
输出:颁发给:www.baidu.com
print("有效期至:", cert['notAfter'])
输出:2025-06-12 12:00:00
```
适用场景:快速检查证书基本信息
方法2:用ssl库获取原始DER格式
import ssl, socket
from cryptography import x509
hostname = "github.com"
ctx = ssl.create_default_context()
with ctx.wrap_socket(socket.socket(), server_hostname=hostname) as s:
s.connect((hostname, 443))
der_data = s.getpeercert(binary_form=True)
获取DER格式
cert = x509.load_der_x509_certificate(der_data)
print("序列号:", cert.serial_number)
输出长串数字如123456789
专业知识点:
- DER是证书的二进制格式
- `serial_number`可用于追踪恶意证书(比如同一个黑客签发的多张钓鱼证书)
方法3:用OpenSSL命令行+Python解析
```bash
先保存为PEM格式文件
openssl s_client -connect google.com:443 -showcerts google.pem
再用Python解析:
from OpenSSL import crypto
with open("google.pem", "rb") as f:
pem_data = f.read()
cert = crypto.load_certificate(crypto.FILETYPE_PEM, pem_data)
print("签名算法:", cert.get_signature_algorithm())
输出:b'sha256WithRSAEncryption'
为什么有用:
发现使用`md5WithRSA`等弱签名算法的证书可以直接标记为风险项!
三、实战案例:如何揪出钓鱼网站?
去年我遇到一个仿冒某银行的网站`https://www.bank0fchina.com`(注意是数字0不是字母o),通过Python脚本发现:
1. 颁发机构异常:显示为"Free SSL CA"而非正规CA
2. 密钥长度不足:只有1024位(正规银行至少2048位)
3. 扩展信息缺失:缺少关键的身份验证扩展字段
自动化检测脚本片段:
def check_risk(cert):
risk_points = []
if "Free SSL" in str(cert['issuer']):
risk_points.append("非权威CA颁发")
if int(cert['keySize']) < 2048:
risk_points.append(f"弱密钥长度:{cert['keySize']}位")
return risk_points
risks = check_risk(get_cert("www.bank0fchina.com"))
print("风险项:" + ", ".join(risks))
四、高级技巧:监控全公司证书到期
企业常用代码模板:
import datetime
certs = [
("官网", "www.company.com"),
("API服务", "api.company.com")
]
for name, domain in certs:
cert = get_cert(domain)
expire_date = datetime.datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
days_left = (expire_date - datetime.datetime.now()).days
if days_left < 30:
send_alert(f"{name}({domain})证书将在{days_left}天后过期!")
五、安全工程师的建议
1. 定期检查:重要域名至少每月检查一次(可用上述代码自动化)
2. 关注细节:
- `subjectAltName`字段是否包含所有子域名?
- OCSP装订扩展是否存在?
3. 工具推荐:
- crt.sh (免费查询历史证书)
- SSL Labs测试(全面评分)
下次遇到"您的连接不是私密连接"警告时,不妨先用Python把证书拖下来看看问题出在哪!
TAG:python下载https证书,python应用认证证书,python下载http文件,python下载网址,python官方证书,进入python官网之后如何下载