在现代网站的配置中,常常需要为多个子域名或不同的域名配置 SSL/TLS 证书。对于开发和测试环境,使用自签名证书是一个方便且经济的选择。OpenSSL 是一个广泛使用的工具,支持生成自签名证书。本文将详细介绍如何通过 OpenSSL 生成一个多域名(SAN,Subject Alternative Name)自签名证书。

步骤概览

  1. 创建一个 OpenSSL 配置文件,指定多个域名。
  2. 使用 OpenSSL 生成私钥。
  3. 生成 CSR(证书签名请求)。
  4. 使用 OpenSSL 生成自签名证书,包含多个域名。

步骤 1:创建 OpenSSL 配置文件

首先,您需要创建一个自定义的 OpenSSL 配置文件,在该配置文件中指定所有需要包含的域名。默认情况下,OpenSSL 的配置文件通常位于 /etc/ssl/openssl.cnf,但为了避免更改默认文件,您可以创建一个新的配置文件。

  1. 在您的工作目录中创建一个名为 openssl.cnf 的文件,内容如下:
[ req ]
distinguished_name  = req_distinguished_name
x509_extensions     = v3_req

[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = JiangSu
localityName = Locality Name (eg, city)
localityName_default = NanJing
organizationalUnitName  = Organizational Unit Name (eg, section)
organizationalUnitName_default  = My Organization
commonName = Internet Widgits Ltd
commonName_max  = 64

[ v3_req ]
subjectAltName = @alt_names

[ alt_names ]
# 改成自己的域名
DNS.1 = example.com
DNS.2 = www.example.com
DNS.3 = example.net
DNS.4 = www.example.net

# 改成自己的ip
IP.1 = 192.168.1.100
IP.2 = 192.168.1.200

这个配置文件的 subjectAltName 部分定义了多个域名。通过这种方式,您可以为多个域名/IP生成一个证书。例如,在上面的配置中,我们为 example.comwww.example.comexample.netwww.example.net 以及IP192.168.1.100192.168.1.200配置了证书。

步骤 2:生成私钥

在 OpenSSL 中,私钥用于加密和解密数据,确保通信的安全性。使用以下命令生成私钥:

openssl genpkey -algorithm RSA -out privkey.pem -aes256

此命令将生成一个 2048 位的 RSA 私钥,并使用 AES 256 加密对其进行保护。生成的私钥将保存在 privkey.pem 文件中。

步骤 3:生成证书签名请求(CSR)

使用以下命令生成证书签名请求(CSR),您可以根据实际需求选择是否填写额外的字段。

openssl req -new -key privkey.pem -out cert.csr -config openssl.cnf

此命令将使用之前生成的私钥和配置文件生成一个 CSR 文件,保存为 cert.csr

步骤 4:生成自签名证书

通过以下命令,您可以根据之前生成的 CSR 文件和私钥,生成一个自签名证书,并将其保存在 cert.crt 文件中:

openssl x509 -req -in cert.csr -signkey privkey.pem -out cert.crt -days 365 -extensions v3_req -extfile openssl.cnf

这里的 -days 365 参数表示证书的有效期为 365 天。您可以根据需要调整有效期。-extensions v3_req 表示我们会使用 openssl.cnf 配置文件中的 v3_req 扩展来添加 SAN(Subject Alternative Name)。

步骤 5:验证证书

证书生成后,您可以通过以下命令检查证书是否包含了所有的 SAN 域名:

openssl x509 -in cert.crt -noout -text

在输出中,您应该能够看到类似以下的内容,其中列出了所有的域名:

X509v3 Subject Alternative Name: 
     DNS:example.com, DNS:www.example.com, DNS:example.net, DNS:www.example.net, IP Address:192.168.1.100, IP Address:192.168.1.200

总结

通过 OpenSSL 创建多域名自签名证书的过程实际上非常简单,只需要几个步骤即可完成。首先需要配置一个 OpenSSL 配置文件,指定多个域名,接着生成私钥、CSR 文件,最后使用 OpenSSL 生成自签名证书并验证其有效性。使用这种方式,您可以为开发环境中的多个域名快速生成自签名证书,便于测试和开发。

请注意,虽然自签名证书对于开发和内部测试非常方便,但由于它们没有经过公认的证书颁发机构签名,因此在生产环境中,浏览器和客户端会显示安全警告。在生产环境中,建议您使用受信任的证书颁发机构(CA)签发的证书。