使用openssl创建包含SAN的证书

创建包含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

如果没有key,则可以同时一个命令生成key和csr:

$ openssl req -newkey rsa:2048 \
    -out test.csr \
    -keyout test.key -subj "/C=cn/OU=myorg/O=mycomp/CN=myname"" -nodes
  • 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
...

完成。

  1. 获取openssl.conf配置文件

使用openssl命令行获取其对应的缺省openssl.conf配置文件。

#!/bin/bash
OPENSSLCNF=$(openssl version -d | grep "^OPENSSLDIR:" | awk -F\" '{print $2}')/openssl.cnf

openssl x509 -CAcreateserial -CA ${CACERT}.pem -CAkey ${CACERT}.key \
    -in tls.csr -out tls.pem \
    -req -days 365 \
   -extensions SAN -extfile <(cat ${OPENSSLCNF} <(printf "[SAN]\nsubjectAltName=${SAN}"))

你可能感兴趣的:(使用openssl创建包含SAN的证书)