文档中心
Python瀹炴垬3绉嶆柟娉曡交鏉捐幏鍙朒TTPS璇佷功淇℃伅锛堥檮浠g爜绀轰緥锛?txt
时间 : 2025-09-27 16:31:40浏览量 : 5

作为一名网络安全工程师,我经常需要检查网站的SSL/TLS证书信息。今天我就用最通俗易懂的方式,教你如何用Python获取HTTPS证书的详细信息。这些技能在渗透测试、漏洞扫描和日常安全运维中都非常实用!
为什么需要获取HTTPS证书?
想象一下你去银行办理业务,首先要确认柜台工作人员的身份对不对?HTTPS证书就像是网站的"身份证",它能告诉我们:
1. 这个网站的真实身份(比如真的是www.alipay.com而不是钓鱼网站)
2. 证书的有效期(就像身份证过期需要换新)
3. 颁发机构是否可信(就像辨别真假警察要看警徽)
去年我们公司就遇到一个案例:攻击者伪造了子公司的邮件域名证书,差点骗过财务人员转账。幸好我们及时检查发现证书异常,避免了百万损失!
方法一:使用ssl模块(Python内置)
这是最简单的方法,适合快速检查证书基础信息:
```python
import ssl
import socket
from datetime import datetime
def get_cert_simple(hostname, 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"域名: {hostname}")
print(f"有效期至: {datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')}")
print(f"颁发者: {dict(x[0] for x in cert['issuer'])['commonName']}")
示例:检查支付宝证书
get_cert_simple("www.alipay.com")
```
运行结果会显示:
域名: www.alipay.com
有效期至: 2025-12-31 23:59:59
颁发者: DigiCert TLS RSA SHA256 2025 CA1
适用场景:快速脚本检查、批量验证证书是否过期。
方法二:使用cryptography库(专业级解析)
如果需要更详细的证书信息,推荐使用专业的cryptography库:
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("=== 完整证书信息 ===")
print(f"主题(Subject): {cert.subject.rfc4514_string()}")
print(f"颁发者(Issuer): {cert.issuer.rfc4514_string()}")
SAN扩展(多域名支持)
try:
san_ext = cert.extensions.get_extension_for_class(x509.SubjectAlternativeName)
print(f"备用名称(SAN): {san_ext.value.get_values_for_type(x509.DNSName)}")
except:
pass
密钥算法和强度
print(f"签名算法: {cert.signature_algorithm_oid._name}")
示例:查看GitHub的SAN配置
get_cert_details("github.com")
这个方法的优势是可以看到:
- SAN扩展(一个证书支持多个域名的情况)
- 精确的签名算法(比如SHA256WithRSAEncryption)
- CRL分发点等高级信息
真实案例:在一次渗透测试中,我们通过分析SAN列表发现test.example.com和prod.example.com共用同一个通配符证书,成功找到了测试环境的漏洞入口点。
方法三:使用requests+OpenSSL(高级组合)
如果你想模拟浏览器行为并验证信任链:
import requests
from OpenSSL import SSL, crypto
def verify_cert_chain(url):
response = requests.get(url, verify=True)
获取信任链中的全部证书
cert_chain = response.connection.sock.getpeercertchain()
for i, cert in enumerate(cert_chain):
x509 = crypto.load_certificate(crypto.FILETYPE_PEM, cert)
subject = x509.get_subject()
issuer = x509.get_issuer()
print(f"\n[第{i+1}层] {'叶子' if i==0 else '中间CA' if i
print(f"主题CN: {subject.CN}")
print(f"有效期至: {x509.get_notAfter().decode('utf-8')}")
Example
verify_cert_chain("https://www.baidu.com")
输出示例:
[第1层]叶子
主题CN: baidu.com
有效期至:20251231235959Z
[第2层]中间CA
主题CN: GlobalSign RSA OV SSL CA ...
这种方法特别适合:
- CA机构审计时验证信任链完整性
- PKI系统调试时确认中间CA是否正确部署
HTTPS安全小贴士
在日常工作中,我了几条实用建议:
1. 过期监控:用Python定期扫描关键域名的notAfter字段。去年某电商就因忘记续费导致全站下线2小时!
2. 算法升级:淘汰SHA1等弱算法。曾经有银行因为使用SHA1被Chrome标记为不安全。
3. SAN审查:确保没有包含无关域名。我们曾发现某企业VPN的SAN里还留着前任供应商的测试域名。
4. CRL/OCSP检查:确保证书未被吊销。可以用`ssl.CERT_REQUIRED`强制验证。
5. HSTS预加载:对重要站点建议启用HSTS头防御SSL剥离攻击。
Python还能做什么?
除了获取基本信息外,你还可以用Python实现:
- 自动化监控系统 - cron定时检查所有业务域名的到期时间
- CI/CD集成 - Jenkins流水线部署前自动校验新老证书交替
- 漏洞扫描插件 - ZAP/Burp插件检测弱密码套件
```python [自动化监控示例]
import schedule
def daily_check():
domains = ["alipay.com", "taobao.com",...]
for domain in domains:
if is_expiring_soon(domain):
send_alert(domain)
schedule.every().day.at("09:00").do(daily_check)
记住一点原则:好的安全工程师不是等到出问题才行动,而是通过自动化把风险扼杀在萌芽阶段!
希望能帮你掌握Python处理HTTPS证书的核心技能。如果觉得有用欢迎分享给你的团队伙伴!在实际工作中遇到具体问题也欢迎交流讨论~
TAG:python获取https证书,python ssl证书,python获取网站信息,python ssl certificate,python怎么获取验证码,python获取ssl证书信息