ssl新闻资讯

文档中心

Python鑾峰彇HTTPS璇佷功璇﹁В3绉嶆柟娉曡交鏉炬悶瀹氱綉绔欏畨鍏ㄦ娴?txt

时间 : 2025-09-27 16:31:50浏览量 : 3

2Python鑾峰彇HTTPS璇佷功璇﹁В3绉嶆柟娉曡交鏉炬悶瀹氱綉绔欏畨鍏ㄦ娴?txt

在网络安全工作中,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