创建包含SAN的证书
SAN:Subject Alternative Name
- 修改openssl.cnf
拷贝/etc/pki/tls/openssl.cnf到当前目录,做如下修改:
- 打开copy_extensions 在CA_default节
[ CA_default ]
...
# Extension copying option: use with caution.
copy_extensions = copy
...
- 打开req_extensions 在req节
[ req ]
...
req_extensions = v3_req # The extensions to add to a certificate request
...
- 增加subjectAltName 在v3_req节
[ v3_req ]
...
subjectAltName = @alt_names
[alt_names]
DNS.1 = *.org.example.com
DNS.2 = *.example.com
- 生成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
...
- 请求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
...
- 另一种方式:命令行单行方式
前面的办法需要修改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
...
完成。
- 获取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}"))