一 概述
一般使用自签名证书的情况下,我们都习惯的使用 *.domain.com
这种通配符证书,也叫 泛域名证书,在使用上没有任何影响,甚至会更加便利。
但是也不排除在一些严格要求,不允许申请和使用泛域名证书的情况下,我们需要使用一张包含多域名的证书。
二 具体操作
- 自生成一个根 CA。
- 生成证书申请的配置信息文件。
- 使用该配置信息文件进行生成
*.csr
证书签名请求文件。 - 使用该请求文件向第一步生成的根 CA 进行申请证书。
2.1 创建自签名根 CA 证书
Notes:
如果已经存在,或者有其它的可靠根 CA 的话,这一步可以跳过。
# 1. 创建一个临时目录
mkdir openssl_san/
cd openssl_san/
# 2. 使用 OpenSSL 生成自签名根 CA,长度为 2048 bit(可自行修改为 4096 bit)
openssl genrsa -out CA.pem 2048
# 返回
# Generating RSA private key, 2048 bit long modulus
# ..............................+++
# .............................................................+++
# e is 65537 (0x10001)
# 3. 生成根证书的 CSR 签发申请文件
openssl req \
-new \
-key CA.pem \
-out CA.csr \
-subj "/C=CN/ST=GuangZhou/L=China/OU=Domain/CN=CA"
# 4. 使用 CSR 文件对 CA.pem 进行自签发
openssl x509 \
-req \
-days 3650 \
-sha1 \
-extensions v3_ca \
-signkey CA.pem \
-in CA.csr \
-out CA.cer
# 返回:
# Signature ok
# subject=/C=CN/ST=GuangZhou/L=China/OU=Domain/CN=CA
# Getting Private key
# 自此,我们有了自己的根 CA。
2.2 使用根 CA 进行签发证书
当我们有了根 CA 之后,即可使用 CA 证书进行签发新的证书:
# 1. 编写证书配置信息文件
cat > ssl.conf <<EOF
[req]
distinguished_name = req_distinguished_name
req_extensions = v3_req
[req_distinguished_name]
countryName = CN
countryName_default = CN
stateOrProvinceName = GuangZhou
stateOrProvinceName_default = GuangZhou
localityName = China
localityName_default = China
organizationalUnitName = Domain
organizationalUnitName_default = Domain
commonName = *.domain.com
commonName_max = 64
[ v3_req ]
# Extensions to add to a certificate request
basicConstraints = CA:false
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
# 配置该证书的可用域名
[alt_names]
DNS.1 = www.domain.com
DNS.2 = mail.domain.com
DNS.3 = code.domain.com
EOF
# 2. 创建下级证书私钥
openssl genrsa -out domain.key 2048
# 3. 使用 ssl.conf 文件生成证书的请求文件
openssl req \
-new \
-key domain.key \
-config ssl.conf \
-out domain.csr \
-subj "/C=CN/ST=GuangZhou/L=China/OU=Domain/CN=IT"
# 4. 使用 domain.csr 向 CA 申请签发
openssl x509 \
-req \
-days 3650 \
-in domain.csr \
-CA CA.cer \
-CAcreateserial \
-CAkey CA.pem \
-out domain.crt \
-extensions v3_req \
-extfile ssl.conf
# 返回:
# Signature ok
# subject=/C=CN/ST=GuangZhou/L=China/OU=Domain/CN=IT
# Getting CA Private Key
# 过程中生成的 domain.crt 和 domain.key 即是后续可用于 Nginx 的 SSL 证书
2.3 验证
# 1. 查看证书是否多域名 openssl \ x509 \ -noout \ -text \ -in domain.crt |grep -A 1 'Subject Alternative' # 返回: X509v3 Subject Alternative Name: DNS:www.domain.com, DNS:mail.domain.com, DNS:code.domain.com # 2. 检查证书是否被证书 openssl verify -CAfile CA.cer domain.crt # 返回: # domain.crt: OK