ssl新闻资讯

文档中心

Python鐢熸垚SSL璇佷功瀹炴垬鎸囧崡3鍒嗛挓鎼炲畾HTTPS鍔犲瘑

时间 : 2025-09-27 16:31:48浏览量 : 4

2Python鐢熸垚SSL璇佷功瀹炴垬鎸囧崡3鍒嗛挓鎼炲畾HTTPS鍔犲瘑

在网络安全领域,SSL/TLS证书是保护数据传输安全的基石。无论是网站HTTPS加密、API通信还是物联网设备身份验证,都离不开它。但传统申请证书流程繁琐(比如找CA机构、付费、等待审核),而Python能让我们快速生成自签名证书用于测试或内网环境。本文将通过4个实际场景,手把手教你用Python生成SSL证书,并解释背后的安全逻辑。

一、为什么需要自己生成SSL证书?

1. 常见用途

- 开发测试:本地调试HTTPS服务时,不用花钱买正式证书。

- 内网通信:企业内部系统(如数据库、监控平台)需加密但无需公开信任。

- 自动化运维:批量给设备签发证书时,用脚本更高效。

2. 自签名 vs CA签发

- 自签名证书(本文重点):自己充当CA(证书颁发机构),适合非公开场景。浏览器会提示“不安全”,但数据仍加密。

*举例*:你开发一个内部财务系统,用自签名证书后,员工访问时会看到警告,但实际通信是加密的。

- CA签发证书:由Let's Encrypt、DigiCert等机构颁发,浏览器自动信任。

二、Python生成SSL证书的4种方法

方法1:用`cryptography`库(推荐)

这是Python中最专业的密码学库,连PyPI官网都用它管理包签名。

```python

from cryptography import x509

from cryptography.hazmat.primitives import hashes, serialization

from cryptography.hazmat.primitives.asymmetric import rsa

from cryptography.x509.oid import NameOID

import datetime

生成私钥

private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)

填写证书信息(比如域名、组织名)

subject = issuer = x509.Name([

x509.NameAttribute(NameOID.COUNTRY_NAME, "CN"),

x509.NameAttribute(NameOID.ORGANIZATION_NAME, "My Company"),

x509.NameAttribute(NameOID.COMMON_NAME, "mysite.com"),

])

构建证书

cert = x509.CertificateBuilder().subject_name(

subject

).issuer_name(

issuer

).public_key(

private_key.public_key()

).serial_number(

x509.random_serial_number()

).not_valid_before(

datetime.datetime.utcnow()

).not_valid_after(

datetime.datetime.utcnow() + datetime.timedelta(days=365)

).sign(private_key, hashes.SHA256())

保存为PEM文件

with open("cert.pem", "wb") as f:

f.write(cert.public_bytes(serialization.Encoding.PEM))

with open("key.pem", "wb") as f:

f.write(private_key.private_bytes(

encoding=serialization.Encoding.PEM,

format=serialization.PrivateFormat.TraditionalOpenSSL,

encryption_algorithm=serialization.NoEncryption()

))

```

关键点解释

- `key_size=2048`:RSA密钥长度低于2048会被认为不安全。

- `COMMON_NAME`:通常填域名,浏览器会校验这里是否和访问地址一致。

方法2:调用OpenSSL命令行(适合快速生成)

Python可以间接调用系统OpenSSL工具(底层和人工敲命令一样):

import subprocess

subprocess.run([

"openssl", "req", "-x509", "-newkey", "rsa:2048",

"-keyout", "key.pem", "-out", "cert.pem", "-days", "365",

"-nodes", "-subj", "/C=CN/ST=Beijing/L=Beijing/O=Test/CN=localhost"

*参数说明*:

- `-nodes`:私钥不加密保护(否则每次使用都要输密码)。

- `-subj`:直接跳过交互式提问环节,自动化必备!

方法3:用于Flask/Django的临时证书

开发Web应用时,可以用`pyopenssl`库快速起一个HTTPS服务:

from OpenSSL import crypto, SSL

生成密钥对

k = crypto.PKey()

k.generate_key(crypto.TYPE_RSA, 2048)

创建自签名证书

cert = crypto.X509()

cert.get_subject().CN = "localhost"

本地测试用localhost

cert.set_serial_number(1000)

cert.gmtime_adj_notBefore(0)

cert.gmtime_adj_notAfter(365*24*60*60)

有效期1年

cert.set_issuer(cert.get_subject())

cert.set_pubkey(k)

cert.sign(k, 'sha256')

Flask中使用示例

context = SSL.Context(SSL.TLSv1_2_METHOD)

context.use_privatekey(k)

context.use_certificate(cert)

(接Flash的app.run(ssl_context=context))

三、安全注意事项??

1. 不要在生产环境用自签名证书:用户浏览器会弹警告,降低信任度;企业应用建议用Let's Encrypt免费证书。

2. 密钥保护原则:生成的`.pem`文件相当于密码本,必须设置600权限(仅拥有者可读写)。

3. 定期轮换证书:即使内网使用,也应每年更新一次密钥对以防破解。

四、高级技巧延伸

如果想模拟CA机构批量签发下属证书(比如给公司所有服务器发证):

1. 先创建一个根CA证书(权威源头)。

2. 用这个CA的私钥给其他CSR(证书签名请求)签字。

(接方法1代码)

csr = x509.CertificateSigningRequestBuilder().subject_name(subject).sign(private_key, hashes.SHA256())

ca_cert.sign(csr, ca_private_key)

CA用自己的私钥为CSR签名

通过Python生成SSL证书不仅节省时间,还能深入理解HTTPS背后的工作原理。下次当你看到浏览器里的小锁图标时,就知道它背后可能是这样一段代码在守护安全!

TAG:python生成ssl证书,python3 ssl,python获取ssl证书信息,python ssl模块详解,python ssl module