通过 openssl 创建 SAN

SAN

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)

Licensed under CC BY-NC-SA 4.0
Built with Hugo
Theme Stack designed by Jimmy