我希望这个问题是重复的,但我找不到简洁的答案,因此我将其作为一个更完整的问题提供,使用 OpenSSL 生成x509用于代码签名(或任何其他目的)的自签名证书。
Steps:
- 生成 CA(证书颁发机构)密钥
- 生成 x509 CA 证书(DER 编码)
- 创建 CSR(证书签名请求)模板
- 使用 CSR 模板生成 CSR
- 创建签名证书模板
- 生成 x509 签名证书和密钥对(DER 编码)
- (可选)将 DER 转换为 PKCS12 格式(Windows 需要此)
- (可选)查看您的作品
我将使用与真实组织没有任何关系的假公司(The Company Ltd)
See 维基百科有关 BER、DER 和 CER 格式的说明。注意 .cer 通常用作 DER 文件的文件扩展名 - Doh!
另请参阅维基百科关于 PKCS12 格式
1 - 生成 CA 密钥
openssl genrsa -des3 -out rootCA.key 4096
给根 CA 密钥一个密码,不要忘记!
2 - 创建 x509 CA 证书(DER 编码)
openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
输入详细信息:[示例]
- 国家:[英国]
- 省份:[英格兰]
- 城市: [伦敦]
- 机构:[有限公司]
- 部门:[工程]
- 通用名称:[有限公司-工程根证书]
- email: [[电子邮件受保护]]
3 - 编辑 CSR 模板:code_sign_csr.conf
[ req ]
default_bits = 2048 # RSA key size
encrypt_key = yes # Protect private key
default_md = sha256 # MD to use
utf8 = yes # Input is UTF-8
string_mask = utf8only # Emit UTF-8 strings
prompt = yes # Prompt for DN
distinguished_name = codesign_dn # DN template
req_extensions = codesign_reqext # Desired extensions
[ codesign_dn ]
commonName = the-company.com
commonName_max = 64
[ codesign_reqext ]
keyUsage = critical,digitalSignature
extendedKeyUsage = critical,codeSigning
subjectKeyIdentifier = hash
4 - 使用模板生成 CSR
openssl req -new -newkey rsa:2048 -keyout testsign.key -sha256 -nodes -out testsign.csr -subj "/CN=The Company Engineering Code Sign Cert" -config code_sign_csr.conf
5 - 创建签名证书模板:code_sign_cert.conf
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName = @alt_names
[alt_names]
DNS.1 = the-company.com
6 - 通过使用 CA 证书签署 CSR 来生成 x509 签名证书和密钥对
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in testsign.csr -out testsign.crt -days 365 -CAcreateserial -extfile code_sign_cert.conf
(5) 和 (6) 中的相同过程用于生成进一步的证书。
7 - (可选)将 x509 证书转换为 PKCS12
openssl pkcs12 -export -out testsign.p12 -inkey testsign.key -in testsign.crt
openssl pkcs12 -export -out rootCA.p12 -inkey rootCA.key -in rootCA.crt
8 - (可选)查看您的作品
openssl x509 -in testsign.crt -noout -text
openssl x509 -in rootCA.crt -noout -text
注意发行人和主题
现在将根 CA 证书提供给需要验证证书的客户端。
向服务器、代码作者、电子邮件发送者等提供根 CA 证书和生成的证书。
注释主题替代名称
- 对于电子邮件签名,主题替代名称 (SAN) 必须与电子邮件匹配
地址
- 对于 DNS 签名,它必须与域名匹配和/或包含通配符。
- 对于服务器,它可以匹配 IP 地址和/或规范名称