如何在 Linux 中为需要 CA 根密钥的多个域创建 SSL 证书

如何在 Linux 中为需要 CA 根密钥的多个域创建 SSL 证书

我有邮件服务器。上面托管了许多域名。我正在上面部署 SSL 证书。我希望当用户使用 https 浏览器访问邮件帐户时,证书是可信的(在 Chrome 中,地址栏中应该显示绿色 https,而不是红色)。

我发现:
我必须先创建 CA 证书。

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -days 1024 -out rootCA.pem

将其复制到用户的工作站上。

然后使用以下命令创建密钥文件。

openssl genrsa -out 设备.key 2048

并使用以下命令使用该密钥文件创建 csr 文件:

openssl req -new -key 设备.key -out 设备.csr

完成后,签署 CSR,这需要 CA 根密钥。

openssl x509 -req -in 设备.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out 设备.crt -days 500

使用上述方法,我只能为单个域创建证书。
如何为多个域创建证书。

答案1

基于名称的 SSL 虚拟主机

如果您在单个 IP 地址上使用多个基于名称的虚拟主机和 SSL,则会出现此问题。Web 服务器在 SSL 握手完成之前不知道所请求主机的名称,因为 HTTP 请求标头是加密内容的一部分。

实际上,像 Apache 这样的 Web 服务器将允许您配置基于名称的 SSL 虚拟主机,但它将始终使用第一个列出的虚拟主机(在选定的 IP 地址和端口上)的配置来设置加密层。请参阅https://wiki.apache.org/httpd/NameBasedSSLVHosts了解更多信息。

如果多个虚拟主机位于同一个域中,则可以使用一个证书,并使用通配符证书(如)*.example.com,该证书适用于one.example.comtwo.example.com

具有 SNI 的基于名称的 SSL 虚拟主机

解决方案是 SSL 协议的扩展,称为服务器名称指示 (SNI),它允许客户端在其 SSL 握手的第一条消息中包含请求的主机名。请参阅https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI了解更多信息。

Apache 需要使用 OpenSSL 构建(enable-tlsext启用 TLS 扩展选项;OpenSSL 0.9.8k 及更高版本默认启用该选项)

要检查您的 Apache 安装是否支持 SNI,请执行以下步骤:

在以下位置启用 NameVirtualHost 的 SSL /etc/apache2/ports.conf

<IfModule mod_ssl.c>
  NameVirtualHost *:443
  Listen 443
</IfModule>

在以下位置创建两个 SSL VirtualHosts/etc/apache2/sites-available/default-ssl

<VirtualHost *:443>
  ServerName www.example1.com
  DocumentRoot /var/www/example1
  SSLEngine on
  SSLCertificateFile    /etc/apache2/example1.com.cert
  SSLCertificateKeyFile /etc/apache2/example1.com.key
</VirtualHost>

<VirtualHost *:443>
  ServerName www.example2.com
  DocumentRoot /var/www/example2
  SSLEngine on
  SSLCertificateFile    /etc/apache2/example2.com.cert
  SSLCertificateKeyFile /etc/apache2/example2.com.key
</VirtualHost>

启用 mod_ssl:

# a2enmod ssl

启用 SSL 站点:

# a2ensite default-ssl

重新启动Apache:

# /etc/init.d/apache2 restart

现在,如果您查看 Apache 错误日志并看到以下消息,则表示 SNI 是内置的。

[warn] Init: Name-based SSL virtual hosts only work for clients with \
       TLS server name indication support (RFC 4366)

否则,你会看到 Apache 启动时出现类似这样的消息You should not use name-based virtual hosts in conjunction with SSL!!

现在,如果您签署了两个证书example1.com.certexample2.com.cert使用 CA 证书,将其添加到浏览器的受信任列表中,并且浏览器支持 SNI,那么您应该能够访问,https://www.example1.com并且https://www.example2.com浏览器不会出现任何投诉。

带有 GnuTLS 的基于名称的 SSL 虚拟主机

GnuTLS 是传输层安全性的 LGPL 许可实现,是 SSL 的后继者。使用 GnuTLS,您可以创建对多个域和通配符域有效的单个证书,如下所示:

DNS Name: example1.com
DNS Name: *.example1.com
DNS Name: example2.com
DNS Name: *.example2.com
DNS Name: example3.com
DNS Name: *.example3.com

https://help.ubuntu.com/community/GnuTLS有关使用 GnuTLS 的详细指南。

相关内容