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

问题描述 投票:0回答:2

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

openssl code-signing code-signing-certificate
2个回答
5
投票

我希望这个问题是重复的,但我找不到简洁的答案,因此我将其作为一个更完整的问题提供,使用 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 格式的说明。注意 .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 protected]]

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

注意发行人和主题

现在将 rootCA 证书提供给需要验证证书的客户端。 将 rootCA 证书和生成的证书提供给服务器、代码作者、电子邮件发送者等。

关于 主题替代名称

的注释
  • 对于电子邮件签名,主题替代名称 (SAN) 必须与电子邮件匹配 地址
  • 对于 DNS 签名,它必须与域名匹配和/或包含通配符。
  • 对于服务器,它可以匹配 IP 地址和/或规范名称

0
投票

testsign.crt 是否应该在密钥使用部分包含数字签名,并在扩展密钥使用部分包含代码签名?

© www.soinside.com 2019 - 2024. All rights reserved.