文档中心
Python鑾峰彇HTTPS璇佷功璇﹁В3绉嶆柟娉曡交鏉炬悶瀹氱綉绔欏畨鍏ㄦ娴?txt
时间 : 2025-09-27 16:31:50浏览量 : 3

在网络安全工作中,HTTPS证书就像网站的"身份证",能验证服务器是否可信。作为安全人员,我们经常需要用Python自动化获取证书信息,比如检查有效期、颁发机构或域名匹配情况。本文用大白话+实际代码案例,教你3种Python获取HTTPS证书的实用方法。
一、为什么要用Python获取HTTPS证书?
想象你管理着100个网站,手动检查每个证书是否过期会累到崩溃。通过Python脚本可以:
- 批量监控证书过期时间(比如提前30天预警)
- 自动发现配置错误(如域名不匹配、自签名证书)
- 渗透测试时收集信息(寻找薄弱点)
二、方法1:用`ssl`标准库(基础版)
Python自带的`ssl`库是最简单的入门方式。就像用手机拍证件照——快速但功能有限。
```python
import ssl
import socket
def get_cert_basic(hostname="www.baidu.com", port=443):
创建SSL上下文(相当于准备一个空白表格)
context = ssl.create_default_context()
建立连接并获取证书(就像请对方填写表格)
with socket.create_connection((hostname, port)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
cert = ssock.getpeercert()
打印关键信息
print(f"颁发给:{cert['subject'][0][0][1]}")
print(f"有效期至:{cert['notAfter']}")
示例:检查百度证书
get_cert_basic()
```
输出示例:
颁发给:www.baidu.com
有效期至:May 25 23:59:59 2025 GMT
适用场景:快速检查单个网站的证书基本信息。
三、方法2:用`cryptography`库(专业版)
如果需要深度解析证书内容(就像法医鉴定身份证真伪),推荐使用专业的`cryptography`库:
from cryptography import x509
from cryptography.hazmat.backends import default_backend
import ssl, socket
def get_cert_details(hostname="github.com"):
获取原始DER格式证书(拿到证件原件)
cert_der = ssl.get_server_certificate((hostname, 443)).encode()
cert = x509.load_pem_x509_certificate(cert_der, default_backend())
提取高级信息
print("SAN扩展域名:",
cert.extensions.get_extension_for_class(
x509.SubjectAlternativeName
).value.get_values_for_type(x509.DNSName))
print("密钥类型:",
cert.public_key().__class__.__name__)
RSA/ECDSA等
get_cert_details()
SAN扩展域名: ['github.com', 'www.github.com']
密钥类型: RSAPublicKey
关键用途:
- 发现隐藏子域名(通过SubjectAltName扩展)
- 识别弱加密算法(如检测到SHA-1签名立即告警)
四、方法3:用`requests`+自定义验证(实战技巧)
在渗透测试中,我们有时需要故意接收无效证书(好比假装相信一张伪造身份证):
import requests
def get_insecure_cert(url="https://expired.badssl.com"):
try:
故意关闭证书验证!
resp = requests.get(url, verify=False)
print("成功获取页面!状态码:", resp.status_code)
仍然可以提取实际使用的证书
cert = resp.raw.connection.sock.getpeercert()
print("实际使用的过期日期:", cert['notAfter'])
except Exception as e:
print("错误:", e)
get_insecure_cert()
?? 安全警告:
- 生产环境绝对不要禁用验证!(相当于不检查身份证就放行)
- 仅用于测试环境,比如检测内部系统是否使用了自签名证书。
五、企业级实践建议
1. 定时任务监控示例
每天检查证书是否快过期
import datetime
def check_expiry(hostname):
cert = ssl.get_server_certificate((hostname,443))
expiry_date = datetime.datetime.strptime(
cert['notAfter'], "%b %d %H:%M:%S %Y GMT"
)
if (expiry_date - datetime.datetime.now()).days <30:
send_alert(f"{hostname}证书将在30天内过期!")
2. CSR自动校验脚本
验证CSR中的域名与申请者是否匹配
csr = x509.load_pem_x509_csr(csr_data, default_backend())
if csr.subject.get_attributes_for_oid(x509.NameOID.COMMON_NAME)[0].value != "example.com":
raise ValueError("域名不匹配!")
表格对比各方法
| 方法 | 优点 | 缺点 | 典型用途 |
||--|--||
| `ssl`标准库 | Python内置无需安装 |信息较简单 |快速基础检查|
| `cryptography` |可解析全部字段 |需要额外安装 |深度分析|
| `requests+verify=False` |可绕过验证获取内容 |极度危险 |渗透测试|
掌握这些方法后,你就能像专业安全人员一样自动化处理HTTPS证书问题啦!记得在生产环境始终开启证书验证哦~
TAG:python获取https 证书,python ssl证书,python获取ssl证书信息,python获取当前网页的url,python怎么获取验证码,python ssl certificate