欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用openssl创建包含SAN的证书

程序员文章站 2022-07-12 23:00:13
...

创建包含SAN的证书

SAN:Subject Alternative Name

  1. 修改openssl.cnf

拷贝/etc/pki/tls/openssl.cnf到当前目录,做如下修改:

  1. 打开copy_extensions 在CA_default节
[ CA_default ]
...
# Extension copying option: use with caution.
copy_extensions = copy
...
  1. 打开req_extensions 在req节
[ req ]
...
req_extensions = v3_req # The extensions to add to a certificate request
...
  1. 增加subjectAltName 在v3_req节
[ v3_req ]
...
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.org.example.com
DNS.2 = *.example.com
  1. 生成CSR证书请求文件

先生成证书私钥test.key:

$ openssl genpkey -algorithm RSA -out test.key

根据私钥test.key生成证书请求文件test.csr:

$ openssl req -new -nodes -key test.key -out test.csr -days 3650 \
  -subj "/C=cn/OU=myorg/O=mycomp/CN=myname" \
  -config ./openssl.cnf -extensions v3_req

验证证书CSR的扩展属性:

# verify the generate CSR file
$ openssl req -noout -text -in test.csr
        ...
        Attributes:
        Requested Extensions:
            X509v3 Subject Alternative Name: 
                DNS:*.server.example.com, DNS:*.example.com
        ...
  1. 请求CA对证书请求文件签名,生成最终证书文件
  • test.csr是前面步骤生成的证书请求文件。
  • ca.crt/ca.key是CA证书文件和key,用来对test.csr进行签名认证。
$ openssl x509 -req -days 365 -in test.csr -out test.pem \
  -CA ca.crt -CAkey ca.key -CAcreateserial \
  -extfile ./openssl.cnf -extensions v3_req

这样我们就能看到SAN信息在证书内容:

# verify generate certificate file
$ openssl x509 -noout -text -in test.pem
        ...
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            X509v3 Key Usage: 
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Subject Alternative Name: 
                DNS:*.org.example.com, DNS:*.example.com
        ...
  1. 另一种方式:命令行单行方式

前面的办法需要修改openssl.cnf文件,如果不想修改openssl.conf文件,可以如下单行命令行来生成SAN信息,也就是把在openssl.cnf文件里面的修改通过命令行的方式来设置。

  • 4.1 生成证书CSR
$ openssl req -new -sha256 \
    -key test.key \
    -subj "/C=cn/OU=myorg/O=mycomp/CN=myname" \
    -reqexts SAN \
    -config <(cat /etc/pki/tls/openssl.cnf \
        <(printf "\n[SAN]\nsubjectAltName=DNS:*.server.example.com,DNS:*.example.com")) \
    -out test.csr
  • 4.2 用CA根证书对前面的CSR进行签名,生成最终的证书
$ openssl x509 -req -days 365 \
    -in test.csr -out test.pem \
    -CA ca.pem -CAkey ca.key -CAcreateserial \
    -extensions SAN \
    -extfile <(cat /etc/pki/tls/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:*.server.example.com,DNS:*.example.com"))
  • 4.3 验证证书的SAN值
$ openssl x509 -noout -text -in test.pem
...
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:*.server.example.com, DNS:*.example.com
...

完成。