我有邮件服务器。上面托管了许多域名。我正在上面部署 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.com
和two.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.cert
并example2.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 的详细指南。