如何使用单个Apache服务器设置多个SSL主机

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

SSL协议的扩展名为“服务器名称指示(SNI)”允许这样做。当前大多数台式机和移动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证书。