ssl新闻资讯

文档中心

Python瀹炴垬3绉嶆柟娉曡交鏉捐幏鍙朒TTPS璇佷功淇℃伅锛堥檮浠g爜绀轰緥锛?txt

时间 : 2025-09-27 16:31:40浏览量 : 5

2Python瀹炴垬3绉嶆柟娉曡交鏉捐幏鍙朒TTPS璇佷功淇℃伅锛堥檮浠g爜绀轰緥锛?txt

作为一名网络安全工程师,我经常需要检查网站的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证书信息