ssl新闻资讯

文档中心

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

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

HTTPS证书的重要性

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

在我们每天上网的过程中,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证书过期怎么解决