在本文中,我们将向您展示如何仅使用单个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/
# 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
# 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证书。
# /etc/init.d/httpd configtest Syntax OK
# service httpd restart
在您喜欢的Web浏览器中打开https://mydomain1.com和https://mymydomain2.com,并验证SSL证书是否已正确安装。
完成此设置并重新启动Apache之后,您可以使用支持SNI的浏览器访问http的站点。如果设置正确,则可以访问该站点而不会出现任何警告或问题。您可以根据需要使用上述过程添加任意数量的网站或SSL证书。