我的 SSL 证书仅适用于“www.example.com”,而不适用于“example.com”

我的 SSL 证书仅适用于“www.example.com”,而不适用于“example.com”

我购买了对 www.example.com 和 example.com 都有效的证书。我的服务器只能使用“www.example.com”(ssl 工作正常),但当我在浏览器上输入“example.com”时,它什么也不显示。这是我的 apache 文件配置,基本上是两次相同的虚拟主机,但服务器名称不同

Define APACHE_LOG_DIR /var/log/apache2
Define SSLCERTIFICATE /etc/apache2/ssl/mycertificate.crt
Define SSLKEY /etc/apache2/ssl/mykey.key
<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin [email protected]
                ServerName www.example.com

                DocumentRoot /var/www/site2/

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile ${SSLCERTIFICATE}
                SSLCertificateKeyFile ${SSLKEY}

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                <Directory />
                        Options FollowSymLinks
                        AllowOverride All
                </Directory>
                <Directory "/var/www/site2">
                        Options Indexes FollowSymLinks MultiViews
                        AllowOverride All
                        Order Allow,Deny
                        Allow from all
                </Directory>


                BrowserMatch "MSIE [2-6]" \
                                nokeepalive ssl-unclean-shutdown \
                                downgrade-1.0 force-response-1.0
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

        </VirtualHost>

        # Same documetn root for example.com (without www)
        <VirtualHost *:443>
                ServerAdmin [email protected]
                ServerName example.com

                DocumentRoot /var/www/site2/

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile ${SSLCERTIFICATE}
                SSLCertificateKeyFile ${SSLKEY}

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                <Directory />
                        Options FollowSymLinks
                        AllowOverride All
                </Directory>
                <Directory "/var/www/site2">
                        Options Indexes FollowSymLinks MultiViews
                        AllowOverride All
                        Order Allow,Deny
                        Allow from all
                </Directory>


                BrowserMatch "MSIE [2-6]"                                 nokeepalive ssl-unclean-shutdown                                 downgrade-1.0 force-response-1.0
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

        </VirtualHost>
</IfModule>

附加信息:

  • 我的网站托管在 Azure 的虚拟机中(Ubuntu 14.04 LTS)
  • 域名来自 goDaddy
  • 还有另一个用于 http (端口 80) 的配置文件

答案1

example.com由于您的证书对和均有效www.example.com,并且两个域都配置为使用相同的目录,因此我认为没有理由将它们作为单独的 VirtualHost。我将删除第二个 VirtualHost,并将第一个 VirtualHost 更改为如下所示:

   <VirtualHost *:443>
            ServerAdmin [email protected]
            ServerName www.example.com
            ServerAlias example.com

[the rest of the config should look the same as it does in your post]

    </VirtualHost>

答案2

您之所以看不到不带 www 的版本,是因为您在 IP 中使用了两个通配符,*:443并且使用了两个不同的域名。Apache 只会使用第一个通配符来使用证书。摘自 Apache 文档[1]:

在 SSL 上使用命名虚拟主机的问题在于,命名虚拟主机依赖于知道请求的主机名,并且在建立 SSL 连接之前无法读取请求。因此,通常的行为是使用接收连接的地址的默认虚拟主机中的配置来设置 SSL 连接。

要使用通配符,您需要每个证书一个 IP。Apache 将使用每个虚拟 IP 来重定向传入的 SSL 加密请求。为此:

  1. 为接口添加虚拟 IP(如果我们假设它是 eth0,则为其添加别名)
  2. 更新文件ports.conf,添加两个条目:
    • 名称VirtualHost IP1:443
    • 名称VirtualHost IP2:443
  3. 更新你的 vHost 如下:

    带有 www 的站点

    ServerName www.site.com

    不带 www 的

    站点 服务器名称 site.com

编辑
您还可以将所有传入点击从“site.com”重定向到“www.site.com”。为此,请删除 vHostsite.com并添加以下行:ServerAlias site.com

这样做将指示 Apache 对两个域使用相同的 vHost。如果您想重定向所有传入的点击(http://example.com, 和http://www.example.com)到主安全域(https://www.example.com),考虑添加以下指令:

RewriteEngine On
RewriteCond %{HTTPS} off
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

根据 Serverfault 规则,site.com 被 example.com 取代

[1]https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

答案3

由于您想使用 SNI,因此必须启用它。检查

名称虚拟主机 *:443

在你的配置中某处可用

不过我觉得最好还是加一个serverAlias,并且要和root目录一样,可以通过mod_rewrite来选择不同。

答案4

最后我通过这样做珍妮D建议并从 重定向mypage.comwww.mypage.com并更改 goDaddy 配置(我的域名所在位置)中的“www”CName 以指向我的 azure VM 地址。

因此,在这种情况下,既不需要修改 .htaccess,也不需要使用 SNI。不确定这是否是最佳或理想的配置,但至少是可行的。

相关内容