You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:20:16