如何在单个 Apache 服务器上设置多个 SSL 主机


在本文中,我们将向您展示如何在 CentOS 上使用单个 IP 地址在 Apache 上设置多个 SSL 证书。通常,网站管理员被限制在每个套接字使用一个 SSL 证书,这将导致公司产生大量的投资。此限制可能导致他们为其域名托管购买多个 HTTP 网站的 IP 地址,或购买允许他们使用多个网络适配器的硬件。

这可以通过称为服务器名称指示 (SNI) 的 SSL 协议扩展来实现。大多数当前的台式机和移动 Web 浏览器都支持 SNI。使用 SNI 的主要好处是能够保护多个网站,而无需购买更多 IP 地址。

配置

确保已安装并启用了 **mod_ssl** 安全模块,以便 Apache Web 服务器可以使用 OpenSSL 库和工具包

# yum install mod_ssl openssl

执行以下命令

# mkdir -p /etc/httpd/ssl/
# mv /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak
# cd /etc/httpd/ssl/

为您的域名生成 SSL 证书签名请求文件

# openssl genrsa -out mydomain1.key 2048
# openssl req -new -key mydomain1.key -out mydomain1.csr
# openssl genrsa -out domain2.key 2048
# openssl req -new -key mydomain2.key -out mydomain2.csr
Enter the following details for your certificates:
Country Name (2 letter code) [AU]:IN
State or Province Name (full name) [Some-State]:Telengana
Locality Name (eg, city) []:Hyderabad
Organization Name (eg, company) [Internet Widgits Pty Ltd]:mydomain1.com
Organizational Unit Name (eg, section) []:mydomain.com
Common Name (e.g. server FQDN or YOUR name) []:mydomain1.com
Email Address []:sslcertificate@domain1.com

在生产环境中部署时,建议安装商业 SSL 证书。或者,我们只需生成自签名 SSL 证书,该证书用于开发目的或使用以下命令对网站进行暂存

# openssl x509 -req -days 365 -in mydomain1.csr -signkey mydomain1.key -out domain1.crt
# openssl x509 -req -days 365 -in mydomain2.csr -signkey mydomain2.key -out mydomain2.crt

编辑“ssl.conf” Apache 配置文件

# vi /etc/httpd/conf.d/ssl.conf
LoadModule ssl_module modules/mod_ssl.so
Listen 443
NameVirtualHost *:443
   SSLPassPhraseDialog builtin
   SSLSessionCacheTimeout 300
   SSLMutex default
   SSLRandomSeed startup file:/dev/urandom 256
   SSLRandomSeed connect builtin
   SSLCryptoDevice builtin
   SSLStrictSNIVHostCheck off
<VirtualHost *:443>
   DocumentRoot /var/www/html/mydomain1
   ServerName mydomain1.com
   ServerAlias www.mydomain1.com
   SSLEngine on
   SSLProtocol all -SSLv2
   SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
   SSLCertificateFile /etc/httpd/ssl/mydomain1.cr
   SSLCertificateKeyFile /etc/httpd/ssl/mydomain1.key
   ErrorLog logs/ssl_error_log
   TransferLog logs/ssl_access_log
   LogLevel warn
   <Files ~ "\.(cgi|shtml|phtml|php3?)$">
   SSLOptions +StdEnvVars
   </Files>
   SetEnvIf User-Agent ".*MSIE.*" \
   nokeepalive ssl-unclean-shutdown \
   downgrade-1.0 force-response-1.0
   CustomLog logs/ssl_request_log \
   "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
<VirtualHost *:443>
   DocumentRoot /var/www/html/mydomain2
   ServerName mydomain2.com
   ServerAlias www.mydomain2.com
   SSLEngine on
   SSLProtocol all -SSLv2
   SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
   SSLCertificateFile /etc/httpd/ssl/mydomain2.crt
   SSLCertificateKeyFile /etc/httpd/ssl/mydomain2.key
   ErrorLog logs/ssl_error_log
   TransferLog logs/ssl_access_log
   LogLevel warn
   <Files ~ "\.(cgi|shtml|phtml|php3?)$">
   SSLOptions +StdEnvVars
   </Files>
   SetEnvIf User-Agent ".*MSIE.*" \
   nokeepalive ssl-unclean-shutdown \
   Downgrade-1.0 force-response-1.0
   CustomLog logs/ssl_request_log \
   "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>

当我们使用商业 SSL 证书时,签名机构可能会包含一个中间 CA 证书。在这种情况下,我们创建一个新的“/etc/httpd/ssl/ca.crt”文件并将中间 CA 的内容粘贴到其中,然后我们需要编辑“ssl.conf”配置文件并取消注释以下行。

SSLCertificateChainFile /etc/httpd/ssl/ca.crt

以便 Apache Web 服务器可以找到您的 CA 证书。

测试 Apache 配置

# /etc/init.d/httpd configtest
Syntax OK

重新启动 Apache 服务以使更改生效

# service httpd restart

在您喜欢的 Web 浏览器中打开 https://mydomain1.com 和 https://mymydomain2.com,并验证 SSL 证书是否已正确安装。

在此设置和重新启动 Apache 后,您可以使用支持 SNI 的浏览器访问 http 站点。如果设置正确,则您将能够访问该站点,而不会出现任何警告或问题。您可以根据需要添加任意数量的网站或 SSL 证书以使用上述过程。

更新于: 2020 年 1 月 20 日

4K+ 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告

© . All rights reserved.