许多网站都有不同的 URL,例如, www.example.com} , www.example.org} , example.com} 都指向同一 Web 服务器。由于大多数 TLS 客户端程序都实施了主机名匹配策略,因此证书中的公用名必须与服务器的主机名匹配,否则 TLS 客户端将拒绝与服务器通信。

为了使证书具有多个名称, X.509 规范定义了一个叫 Subject Alternative Name (SAN)的扩展。使用 SAN 扩展,可以在证书的 subjectAltName} 字段中指定多个主机名。

要使用该字段生成证书签名请求,我们可以使用配置文件,并将所有必要的信息放入该文件中( PKI 实验显示了如何在命令行中执行所有操作)。以下配置文件给出了一个示例。它指定 subject 字段的内容,并在扩展中添加 subjectAltName} 字段。该字段指定多个备用名称,包括通配符名称 *.bank32.com} 。应该注意的是,该字段还必须包括 common name 字段里的名字,否则 common name 字段里的名字将不会被接受。
/* server_openssl.cnf */
[ req ]
prompt             = no
distinguished_name = req_distinguished_name
req_extensions     = req_ext

[ req_distinguished_name ]
C  = US
ST = New York
L  = Syracuse
O  = XYZ LTD.
CN = www.bank32.com

[ req_ext ]
subjectAltName = @alt_names

[alt_names]
DNS.1   = www.bank32.com
DNS.2   = www.example.com
DNS.3   = *.bank32.com

我们可以使用下面的 "openssl req"} 命令生成一对公私钥对和一个证书签名请求:
openssl req -newkey rsa:2048 -config ./server_openssl.cnf -batch \
            -sha256  -days 3650 -keyout server.key -out server.csr


出于安全考虑,默认情况下 CA 签署证书时不会将扩展字段从证书签名请求中复制到最终证书中。为了允许复制,我们需要更改 openssl} 的配置文件。默认情况下, openssl} 使用 \path{/usr/lib/ssl} 目录中的配置文件 openssl.cnf} 。在此文件中, copy\_extensions} 选项被禁用(注释掉了)。我们不想修改系统的配置文件,所以我们将文件复制到自己的文件夹中,将其重命名为 myopenssl.cnf} 。然后,我们从该文件中取消以下行的注释:
# Extension copying option: use with caution.
copy_extensions = copy

我们用下面的程序和证书签名请求为服务器生成证书 ( server.crt}),请求中所有的扩展域都会被复制到最终的证书中。
openssl ca -md sha256 -days 3650 -config ./myopenssl.cnf -batch \
           -in server.csr -out server.crt \
           -cert ca.crt -keyfile ca.key

学生需要展示自己的服务器可以支持多个主机名,包括其各自域名中的主机名。



Last modified: Tuesday, 13 May 2025, 9:36 AM