SAN 简介
SAN(Subject Alternative Name) 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。
使用 openssl 生成带有 SAN 字段的证书
生成证书的方式有两种
第一种是通过配置文件的方式加载为证书加载配置(较为推荐),便于维护。
第二种是直接通过命令的方式进行创建,也是现在网上流传的很广的一种方式。
两种方式其实很相似,区别就在于有无对应证书的配置文件
方式一
生成自签名证书认证文件
通过证书授权文件对证书签发请求进行签名,自签名的方式需要有一个自己的私钥文件来进行签发。因此,需要通过以下命令来生成相应文件
1
|
openssl req -new -newkey rsa:2048 -days [validity] -extensions v3_ca -subj "[key_details]" -nodes -x509 -sha256 -set_serial 0 -keyout [root_key].key -out [root_cer].cer
|
[validity]: 证书有效时间,单位为 天。
[key_details]: 正确的格式应该为:/C=[CO]/ST=[ST]/L=city/O=[org]/OU=[unit]/CN=[display_name]/
[root_key]: 根证书的私钥名称
[root_cer]: 根证书的证书名称
为 SAN 创建对应的配置文件
创建一个后缀为 .cnf
的配置文件用于保存相关 SAN 的配置,域名较多时,可以创建多个便于后期维护时见名知义。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
# openssl-san.cnf
[ req ]
default_bits = 2048
distinguished_name = req_distinguished_name
req_extensions = req_ext
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
stateOrProvinceName = State or Province Name (full name)
localityName = Locality Name (eg, city)
organizationName = Organization Name (eg, company)
commonName = Common Name (e.g. server FQDN or YOUR name)
# Optionally, specify some defaults.
countryName_default = [Country]
stateOrProvinceName_default = [State]
localityName_default = [City]
0.organizationName_default = [Organization]
organizationalUnitName_default = [Organization unit]
emailAddress_default = [Email]
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = [DNS1]
DNS.2 = [DNS2]
|
[DNS1] or [DNS2] (or more if needed): SAN 名称,一行对应一个,域名增加,相应编号也增加即可
使用 SAN 配置文件生成相应签名请求
1
|
openssl req -newkey rsa:2048 -subj "/C=CN/ST=JS/L=NJ/O=trantect/OU=trantect/CN=grpc.trantect.com" -nodes -sha256 -keyout server.key -out server.csr -reqexts req_ext -config trantect-san.cnf
|
[csr]: certificate signing request 证书签名请求文件
[reqexts]: 指定请求扩展
[config]: 指定 SAN 请求配置文件
使用 (Certifying Authority)CA 进行签名
1
|
openssl x509 -req -sha256 -CAcreateserial -in server.csr -days 3650 -CA ca.crt -CAkey ca.key -out server.crt -extensions req_ext -extfile trantect-san.cnf
|
命令中的 extensions
以及 extfile
代表指定请求扩展和对应的配置文件路径。
方式二
较为普遍,网上很容易就能找到,但是不便于维护。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
# 生成.key 私钥文件
openssl genrsa -out ca.key 2048
# 生成.csr 证书签名请求文件
openssl req -new -key ca.key -out ca.csr -subj "/C=GB/L=China/O=lixd/CN=grpc.trantect.com"
# 自签名生成.crt 证书文件
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/C=GB/L=China/O=lixd/CN=grpc.trantect.com"
# 生成.key 私钥文件
openssl genrsa -out server.key 2048
# 生成.csr 证书签名请求文件
openssl req -new -key server.key -out server.csr \
-subj "/C=GB/L=China/O=lixd/CN=grpc.trantect.com" \
-reqexts SAN \
-config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.trantect.com"))
# 签名生成.crt 证书文件
openssl x509 -req -days 3650 \
-in server.csr -out server.crt \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-extensions SAN \
-extfile <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:*.trantect.com"))
|
Reference
How to create a certificate using OpenSSL with Subject Alternative Name field (SAN)