当前位置:首页 > 行业动态 > 正文

https证书生成源码

HTTPS证书生成需通过密钥对创建、证书签名请求(CSR)生成及CA机构签发三个核心步骤,可使用OpenSSL工具或编程库实现,最终获得包含公钥的数字证书

HTTPS 证书生成流程与源码实现

工具与依赖

  1. OpenSSL:命令行工具,用于生成密钥、签名请求(CSR)、自签名证书等。
  2. 编程库
    • Python:cryptography库(支持密钥生成、CSR 创建、证书签发)。
    • Go:crypto/x509包(处理证书生成与解析)。

证书生成核心步骤

生成私钥

私钥用于加密数据和签名证书,需妥善保管。

  • OpenSSL 命令

    openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
  • Python 代码(使用 cryptography):

    from cryptography.hazmat.primitives.asymmetric import rsa
    from cryptography.hazmat.primitives import serialization
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048
    )
    # 保存为 PEM 格式
    with open("private_key.pem", "wb") as f:
        f.write(private_key.private_bytes(
            encoding=serialization.Encoding.PEM,
            format=serialization.PrivateFormat.PKCS8,
            encryption_algorithm=serialization.NoEncryption()
        ))

创建证书签名请求(CSR)

CSR 包含公钥和证书信息(如域名、组织),提交给 CA 签名。

https证书生成源码  第1张

  • OpenSSL 命令

    openssl req -new -key private_key.pem -out request.csr -subj "/C=US/ST=State/O=Organization/CN=example.com"
  • Python 代码

    from cryptography import x509
    from cryptography.x509.oid import NameOID
    from cryptography.hazmat.primitives import hashes
    # 构建 CSR
    csr = x509.CertificateSigningRequestBuilder().subject_name(x509.Name([
        x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
        x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"State"),
        x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"Organization"),
        x509.NameAttribute(NameOID.COMMON_NAME, u"example.com"),
    ])).add_extension(
        x509.SubjectAlternativeName([x509.DNSName(u"example.com")]),
        critical=False,
    ).sign(private_key, hashes.SHA256())
    # 保存 CSR
    with open("request.csr", "wb") as f:
        f.write(csr.public_bytes(serialization.Encoding.PEM))

自签名证书生成

自签名证书用于测试或内部系统,浏览器会提示不受信任。

  • OpenSSL 命令

    openssl x509 -req -in request.csr -signkey private_key.pem -out self_signed.pem -days 365
  • Python 代码

    from cryptography import x509
    from cryptography.x509.oid import NameOID
    from cryptography.hazmat.primitives import hashes
    # 构建自签名证书
    certificate = x509.CertificateBuilder().subject_name(csr.subject).issuer_name(
        csr.subject
    ).public_key(csr.public_key()).serial_number(x509.random_serial_number()).not_valid_before(
        x509.datetime.datetime.utcnow()
    ).not_valid_after(
        x509.datetime.datetime.utcnow() + x509.datetime.timedelta(days=365)
    ).add_extension(
        x509.SubjectAlternativeName([x509.DNSName(u"example.com")]),
        critical=False,
    ).sign(private_key, hashes.SHA256())
    # 保存证书
    with open("self_signed.pem", "wb") as f:
        f.write(certificate.public_bytes(serialization.Encoding.PEM))

关键参数与安全注意事项

参数/场景 说明
RSA 密钥长度 推荐至少 2048 位,生产环境建议 3072 位或以上。
证书有效期 自签名证书通常设为 365 天,CA 签发证书可设为 1-10 年。
私钥加密存储 | 避免明文存储私钥,使用密码短语加密(如openssl genpkey -aes256`)。
`SAN(主题备用名称) 必须包含所有域名和 IP,否则浏览器会拒绝访问。

相关问题与解答

问题 1:如何验证生成的证书是否有效?

  • 解答
    使用 OpenSSL 命令检查证书内容:

    openssl x509 -in self_signed.pem -text -noout

    验证以下内容:

    • SubjectIssuer 是否匹配(自签名证书需一致)。
    • Validity 是否在有效期内。
    • Subject Alternative Name 是否包含目标域名。

问题 2:如何将自签名证书用于本地开发环境?

  • 解答
    1. self_signed.pemprivate_key.pem 配置到服务器(如 Nginx、Apache)。
    2. 在客户端浏览器中导入自签名证书:
      • 访问 https://example.com,点击“高级”→“继续浏览”→“添加例外”。
      • 导出证书(self_signed.pem)并导入系统受
0