在apache上托管多个SSL证书

时间:2011-03-08 05:37:10

标签: ssl apache2

我希望有人可以帮我一把。我有2个IP可用于执行此操作,需要在同一个Apache服务器上托管2个不同的安全(SSL)域。我已经读过Apache 2.2的内容,可以使用单个IP,使用某种加载项,但我希望尽可能简单,并且愿意使用这两个IP来完成这项任务。我已经拥有2个域名签名证书。

我在这里发布的这个设置有效,但我遇到的问题是,当我去domain2.net时,我收到一个浏览器警告告诉我该证书与域名不匹配但匹配域名网站< / p>

我正在使用CentOS 5和Apache 2.2.3。 CentOS有一个ssl.conf文件,这些行是我认为给我带来的麻烦:

SSLCertificateFile /etc/pki/tls/certs/domain1.com.crt
SSLCertificateKeyFile /etc/pki/tls/private/domain1.com.key

我的印象是我可以在虚拟主机容器中覆盖这些值并引用我需要的密钥,但它不会出现这种情况。当我在ssl.conf文件中注释掉这两行时,Apache将不会重启。 ssl_log提示:SSLCertificateKeyFile

这些是我的虚拟容器:

<VirtualHost 2.2.2.2:443>
   SSLEngine on
   SSLCertificateFile /etc/pki/tls/certs/domain2.net.crt
   SSLCertificateKeyFile /etc/pki/tls/private/domain2.net.key

  DocumentRoot "/var/www/domain2"
   ServerName domain2.net
   ServerAlias domain2.net
   DirectoryIndex "index.php"

   <Directory /var/www/html/domain2>
     Options -Indexes FollowSymLinks
     AllowOverride All
     Order allow,deny
     Allow from all
   </Directory>
</VirtualHost>


<VirtualHost 1.1.1.1:444>
   SSLEngine on
   SSLCertificateFile /etc/pki/tls/certs/domain1.com.crt
   SSLCertificateKeyFile /etc/pki/tls/private/domain1.com.key

  DocumentRoot "/var/www/html"
   ServerName domain1.com
   ServerAlias domain1.com
   DirectoryIndex "index.php"

   <Directory /var/www/html>
     Options -Indexes FollowSymLinks
     AllowOverride All
     Order allow,deny
     Allow from all
   </Directory>
</VirtualHost>

如何使用SSL使这两个域工作?我也试过为不同的IP使用相同的端口,但同样,Apache不会重启。

我真的迷失了,所以如果有人能伸出援助之手,我真的很感激。

3 个答案:

答案 0 :(得分:10)

很棒的问题!

我能够在同一台服务器上运行两个SSL证书。你应该能够做你想做的事。

你的配置中的东西对我来说很奇怪:

  1. 我建议将端口443用于两个受SSL保护的站点。您应该在apache的conf文件中有一个特定的指令,用于侦听端口443.对我而言,它位于/etc/apache2/ports.conf

    Listen 443
    

  2. 使用ServerName和ServerAlias每个虚拟主机使用相同的域似乎很奇怪。尝试使ServerAlias不同或将其删除:

    ServerName domain1.com
    ServerAlias www.domain1.com
    

  3. 我假设您在发布的内容中替换了您的IP和域名。即使它们不是您正在使用的实际IP,您可能需要仔细检查它们是否可以将您带到SSL之外的正确位置(因为很明显SSL不起作用)。

  4. 检查apache2错误日志以获取更多信息。对我来说,日志位于:/var/log/apache2/error.log。你可以用它来设置:     ErrorLog /var/log/apache2/error.log

    最后,这里提到的是我的ssl-default(ssl.conf)。我将您的域名和IP替换为您在示例conf中使用的域名和IP。我有多个子域使用NameVirtualHost,因为我有一个通配符证书:

    <IfModule mod_ssl.c>
    <Directory />
      Options FollowSymLinks
      AllowOverride All
    </Directory>
    <Directory /var/www/>
      Options  FollowSymLinks MultiViews
      AllowOverride All
      Order allow,deny
      allow from all
    </Directory>
    
    NameVirtualHost 1.1.1.1:443
    NameVirtualHost 2.2.2.2:443
    
    ErrorLog /var/log/apache2/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog /var/log/apache2/ssl_access.log combined
    
    <FilesMatch "\.(cgi|shtml|phtml|php)$">
      SSLOptions +StdEnvVars
    </FilesMatch>
    
    # 1.1.1.1 = domain1.com
    
    <VirtualHost 1.1.1.1:443>
      ServerName www.domain1.com
    
      ServerAdmin admin@domain1.com
    
      SSLEngine on
      SSLCertificateKeyFile /var/www/ssl/domain1.key
      SSLCertificateFile /var/www/ssl/wildcard.domain1.crt
    
      BrowserMatch ".*MSIE.*" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    
      DocumentRoot /var/www/domain1/www.domain1.com/web
      DirectoryIndex index.php index.html
    </VirtualHost>
    
    <VirtualHost 1.1.1.1:443>
      ServerName secure.domain1.com
    
      ServerAdmin admin@domain1.com
    
      SSLEngine on
      SSLCertificateKeyFile /var/www/ssl/domain1.key
      SSLCertificateFile /var/www/ssl/wildcard.domain1.crt
    
      BrowserMatch ".*MSIE.*" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    
      DocumentRoot /var/www/domain1/secure.domain1.com/
      DirectoryIndex index.php index.html
    </VirtualHost>
    
    
    # 2.2.2.2 = *.domain2.com
    
    <VirtualHost 2.2.2.2:443>
      ServerName admin.domain2.com
    
      ServerAdmin admin@domain2.com
    
      SSLEngine on
      SSLCertificateKeyFile /var/www/ssl/domain2.key
      SSLCertificateFile /var/www/ssl/domain2.crt
    
      BrowserMatch ".*MSIE.*" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    
      LogLevel warn
      CustomLog /var/log/apache2/access.log combined
      ErrorLog /var/log/apache2/error.log
    
      DocumentRoot /var/www/domain2/secure.domain2.com/web
      DirectoryIndex index.php index.html
    
      php_flag display_errors on
      php_value error_reporting 7
    </VirtualHost>
    
    </IfModule>
    

    我希望这会有所帮助!!

答案 1 :(得分:0)

您不需要单独的ssl.config文件,但是如果您想使用它,则将SSL <VirtualHost XXX:443>容器放在ssl.conf文件中,而不是放在httpd,conf文件中。

我们在我们网站上使用的另一个选项是将ssl.conf文件中的设置放在我们的httpd.conf文件中,并将ssl.conf文件重命名为ssl.conf.bak(以保留它以供参考) )。

答案 2 :(得分:0)

将此Apache命令放在第一个虚拟主机之前可能会有所帮助:

SSLStrictSNIVHostCheck开启

这使我能够拥有多个不同的域,每个域在相同的IP上运行自己的密钥,而不会感到困惑。