如何从 CSR 创建自签名代码签名证书?

fhc*_*cat 4 openssl code-signing code-signing-certificate

标题说明了一切。我能找到的所有文章要么是关于生成自签名 SSL 证书,要么是不考虑 CSR。我的要求很简单:生成一个自签名代码签名证书,我可以将其与 CSR 中的signtool.exe 一起使用以进行测试。

Jas*_*gan 10

我希望这个问题是重复的,但我找不到简洁的答案,因此我将其作为更完整的问题提供,使用 OpenSSL 生成用于代码签名(或任何其他目的)的x509自签名证书。

脚步:

  1. 生成 CA(证书颁发机构)密钥
  2. 生成 x509 CA 证书(DER 编码)
  3. 创建 CSR(证书签名请求)模板
  4. 使用 CSR 模板生成 CSR
  5. 创建签名证书模板
  6. 生成 x509 签名证书和密钥对(DER 编码)
  7. (可选)将 DER 转换为 PKCS12 格式(Windows 需要此)
  8. (可选)查看您的作品

我将使用与真实组织没有任何关系的假公司(The Company Ltd)

有关 BER、DER 和 CER 格式的说明,请参阅Wikipedia 。注意 .cer 通常用作 DER 文件的文件扩展名 - Doh!另请参阅维基百科有关 PKCS12 格式的信息

1 - 生成 CA 密钥

openssl genrsa -des3 -out rootCA.key 4096
Run Code Online (Sandbox Code Playgroud)

给根 CA 密钥一个密码,不要忘记!

2 - 创建 x509 CA 证书(DER 编码)

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt
Run Code Online (Sandbox Code Playgroud)

输入详细信息:[示例]

  • 国家:[英国]
  • 省份:[英格兰]
  • 城市: [伦敦]
  • 机构:[有限公司]
  • 部门:[工程]
  • 通用名称:[有限公司-工程根证书]
  • 电子邮件:[admin@the-company.com]

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
Run Code Online (Sandbox Code Playgroud)

4 - 使用模板生成 CSR

[ 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
Run Code Online (Sandbox Code Playgroud)

5 - 创建签名证书模板:code_sign_cert.conf

authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:FALSE
subjectAltName         = @alt_names
extendedKeyUsage       = codeSigning

[alt_names]
DNS.1 = the-company.com
Run Code Online (Sandbox Code Playgroud)

6 - 通过使用 CA 证书签署 CSR 来生成 x509 签名证书和密钥对

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
Run Code Online (Sandbox Code Playgroud)

(5) 和 (6) 中的相同过程用于生成进一步的证书。

7 - (可选)将 x509 证书转换为 PKCS12

authorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:FALSE
subjectAltName         = @alt_names
extendedKeyUsage       = codeSigning

[alt_names]
DNS.1 = the-company.com
Run Code Online (Sandbox Code Playgroud)

8 - (可选)查看您的作品

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in testsign.csr -out testsign.crt -days 365 -CAcreateserial -extfile code_sign_cert.conf
Run Code Online (Sandbox Code Playgroud)

注意并验证发行人和主题

现在将 rootCA 证书提供给需要验证证书的客户端。

将 rootCA 证书和生成的证书提供给服务器、代码作者、电子邮件发送者等。

将 CA 签名密钥存储在一个非常安全的地方,不要共享它或忘记将它放在哪里......(我总是发现这一点是最难的)。

关于主题替代名称的注释

  • 对于电子邮件签名,主题替代名称 (SAN) 必须与电子邮件地址匹配
  • 对于 DNS 签名,它必须与域名匹配和/或包含通配符。
  • 对于服务器来说,假设存在匹配且可访问的 DNS 记录,它可以匹配 IP 地址和/或规范名称。