如何仅通过Python生成自签名SSL证书(无需额外安装工具)
仅用Python生成安全自签名SSL证书的方案
要实现跨平台、无需额外系统工具的自签名SSL证书生成,推荐使用cryptography库——这是一个维护活跃、安全合规的纯Python密码学库,可通过pip跨平台安装,完全满足你的需求。
以下是完整的实现代码,包含现代安全配置(支持多域名/IP、强加密算法、合理有效期):
from cryptography import x509 from cryptography.x509.oid import NameOID from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives.asymmetric import rsa from cryptography.hazmat.backends import default_backend import datetime def generate_self_signed_cert(cert_path="cert.pem", key_path="key.pem", common_name="localhost", alt_names=["localhost", "127.0.0.1"], key_size=4096, valid_days=365): # 生成RSA私钥 private_key = rsa.generate_private_key( public_exponent=65537, key_size=key_size, backend=default_backend() ) # 设置证书主题和颁发者(自签名场景下两者一致) subject = issuer = x509.Name([ x509.NameAttribute(NameOID.COMMON_NAME, common_name), x509.NameAttribute(NameOID.COUNTRY_NAME, "CN"), x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Unknown"), x509.NameAttribute(NameOID.LOCALITY_NAME, "Unknown"), x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Local Self-Signed Cert"), ]) # 构建证书主体 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=valid_days) ).add_extension( x509.SubjectAlternativeName([x509.DNSName(name) for name in alt_names]), critical=False, ).sign(private_key, hashes.SHA256(), default_backend()) # 保存私钥(PEM格式,无加密) with open(key_path, "wb") as f: f.write(private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.TraditionalOpenSSL, encryption_algorithm=serialization.NoEncryption() )) # 保存证书(PEM格式) with open(cert_path, "wb") as f: f.write(cert.public_bytes(serialization.Encoding.PEM)) print(f"自签名证书已生成:\n- 证书文件:{cert_path}\n- 私钥文件:{key_path}") # 示例调用:可根据用户部署环境修改参数 if __name__ == "__main__": generate_self_signed_cert( common_name="local-django-app", alt_names=["local-django-app", "192.168.1.100", "127.0.0.1"] )
关键安全配置说明
- 密钥强度:使用4096位RSA密钥(若追求性能可降为2048位),避免1024位等弱密钥规格。
- 签名算法:采用SHA-256哈希算法,拒绝已被淘汰的SHA-1算法。
- SAN扩展字段:必须配置该字段,现代浏览器/客户端会强制验证此字段,仅依赖Common Name已无法满足安全要求。
- 有效期:设置1年以内的有效期,避免过长有效期带来的密钥泄露风险。
Django部署适配
生成证书后,在Django的settings.py中添加以下配置:
SECURE_SSL_REDIRECT = True SESSION_COOKIE_SECURE = True CSRF_COOKIE_SECURE = True # 本地测试可使用runserver_plus(需安装django-extensions) # python manage.py runserver_plus --cert-file cert.pem --key-file key.pem
依赖安装
执行以下命令安装cryptography库:
pip install cryptography
内容的提问来源于stack exchange,提问作者NKS
相关产品推荐
相关产品推荐

