文档中心
Python瀹炴垬3绉嶆柟娉曡交鏉捐幏鍙朒TTPS缃戠珯璇佷功锛堥檮浠g爜绀轰緥锛?txt
时间 : 2025-09-27 16:31:40浏览量 : 2
HTTPS证书的重要性

在我们每天上网的过程中,HTTPS协议就像是一位尽职的"门卫",确保我们与网站之间的通信安全可靠。而这个"门卫"的身份证明就是SSL/TLS证书。举个例子,当你在浏览器地址栏看到那个小锁图标时,就说明这个网站使用了有效的HTTPS证书。
作为网络安全从业者,我们经常需要检查网站的SSL证书信息。比如:
- 验证证书是否过期(还记得2025年Let's Encrypt根证书过期导致的大面积故障吗?)
- 检查证书颁发机构是否可信
- 分析证书链完整性
- 监控证书变更(这可能意味着中间人攻击)
Python获取HTTPS证书的3种方法
方法1:使用ssl模块(最基础)
Python内置的ssl模块就像是你的"瑞士军刀",简单但实用:
```python
import ssl
import socket
def get_cert_basic(hostname, port=443):
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()
return cert
示例:获取百度证书
baidu_cert = get_cert_basic("www.baidu.com")
print(baidu_cert)
```
这个方法返回的是一个字典,包含证书的基本信息。比如你可能看到:
{
'subject': ((('countryName', 'CN'),), (('stateOrProvinceName', 'Beijing'),)...),
'notAfter': 'Aug 12 12:00:00 2025 GMT',
'issuer': ((('countryName', 'US'),), (('organizationName', 'DigiCert Inc'),)...)
}
方法2:使用cryptography库(专业级)
如果你需要更详细的证书信息,cryptography库就像是专业的"X光机",能让你看清每个细节:
from cryptography import x509
from cryptography.hazmat.backends import default_backend
def get_cert_details(hostname, port=443):
cert_pem = ssl.get_server_certificate((hostname, port))
cert = x509.load_pem_x509_certificate(cert_pem.encode(), default_backend())
print(f"主题:{cert.subject}")
print(f"颁发者:{cert.issuer}")
print(f"有效期从:{cert.not_valid_before}")
print(f"有效期至:{cert.not_valid_after}")
print(f"签名算法:{cert.signature_hash_algorithm.name}")
示例:检查GitHub的ECDSA签名证书
get_cert_details("github.com")
这个方法的强大之处在于可以访问更多技术细节:
- 公钥类型(RSA/ECC)
- SANs(主题备用名称)
- CRL分发点
- OCSP服务器地址等
方法3:使用requests+OpenSSL组合(面向网络请求)
当你已经在用requests库做网络爬虫时,可以这样顺手获取证书:
import requests
from OpenSSL import crypto
def get_cert_via_requests(url):
response = requests.get(url, timeout=5)
requests底层使用的urllib3会维护连接池,我们需要从连接中提取证书
cert_der = response.raw.connection.sock.getpeercert(binary_form=True)
DER格式转换为可读的X509对象
cert = crypto.load_certificate(crypto.FILETYPE_ASN1, cert_der)
subject = dict(item[0] for item in cert.get_subject().get_components())
issuer = dict(item[0] for item in cert.get_issuer().get_components())
print(f"网站 {url} 使用由 {issuer[b'CN']} 颁发的证书")
print(f"有效期至: {cert.get_notAfter().decode()}")
示例:检查知乎的CDN证书链
get_cert_via_requests("https://www.zhihu.com")
实际应用场景案例
案例1:批量检查子域名证书过期时间
假设公司有100个子域名,我们可以写个脚本定期检查:
import concurrent.futures
domains = ["www.example.com", "api.example.com", "blog.example.com"]
def check_expiry(domain):
try:
cert = get_cert_basic(domain)
expiry_date = cert['notAfter']
return f"{domain} - {expiry_date}"
except Exception as e:
return f"{domain} - ERROR: {str(e)}"
with concurrent.futures.ThreadPoolExecutor() as executor:
results = executor.map(check_expiry, domains)
for result in results:
print(result)
案例2:检测自签名或异常颁发机构
黑客常使用自签名证书进行中间人攻击:
trusted_CAs = ["DigiCert", "Let's Encrypt", "GlobalSign"]
def check_suspicious_ca(hostname):
cert_info = get_cert_basic(hostname)
issuer_name = str(cert_info['issuer'])
is_suspicious = True
if not any(ca in issuer_name for ca in trusted_CAs):
print(f"[!] {hostname}使用非受信任CA: {issuer_name}")
check_suspicious_ca("your-banking-site.com")
HTTPS安全小贴士
1. HSTS预加载:像银行这类关键网站应该加入HSTS预加载列表,防止SSL剥离攻击。
2. OCSP装订:好的网站会启用OCSP装订(就像随身携带实时更新的身份证复印件),减少验证延迟。
3. 密钥轮换:记得2014年Heartbleed漏洞吗?定期更换私钥很重要。
4. SANs匹配:检查所有备用名称是否合理,避免*.example.com这样的泛域名滥用。
5. TLS版本:确保服务器禁用SSLv3/TLS1.0等老旧协议。
通过Python获取和分析HTTPS证书只是网络安全工作的一个小环节。建议将这些技术整合到你的自动化监控系统中,结合CRL/OCSP验证、CAA记录检查等构建完整的PKI监控方案。
TAG:python获取https网站证书,阿里云ssl证书只能用一个月吗,阿里云ssl证书价格一年多少钱,阿里云免费ssl证书到期后要钱吗,阿里云ssl证书多少钱,ssl证书续费 阿里云,阿里云免费ssl证书,第二年要收费吗,阿里云的ssl证书,阿里云ssl证书审核要多久,阿里云ssl证书过期怎么解决