上一篇
https证书生成源码
- 行业动态
- 2025-04-28
- 4035
HTTPS证书生成需通过密钥对创建、证书签名请求(CSR)生成及CA机构签发三个核心步骤,可使用OpenSSL工具或编程库实现,最终获得包含公钥的数字证书
HTTPS 证书生成流程与源码实现
工具与依赖
- OpenSSL:命令行工具,用于生成密钥、签名请求(CSR)、自签名证书等。
- 编程库:
- Python:
cryptography
库(支持密钥生成、CSR 创建、证书签发)。 - Go:
crypto/x509
包(处理证书生成与解析)。
- Python:
证书生成核心步骤
生成私钥
私钥用于加密数据和签名证书,需妥善保管。
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 签名。
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
验证以下内容:
Subject
和Issuer
是否匹配(自签名证书需一致)。Validity
是否在有效期内。Subject Alternative Name
是否包含目标域名。
问题 2:如何将自签名证书用于本地开发环境?
- 解答:
- 将
self_signed.pem
和private_key.pem
配置到服务器(如 Nginx、Apache)。 - 在客户端浏览器中导入自签名证书:
- 访问
https://example.com
,点击“高级”→“继续浏览”→“添加例外”。 - 导出证书(
self_signed.pem
)并导入系统受
- 访问
- 将