Apache 针对公有和私有 IP 提供不同的 SSL 证书

Apache 针对公有和私有 IP 提供不同的 SSL 证书

我有一个可以通过以下方式访问的 Web 服务器

(1)内部私有IP地址192.168.0.1;

(2)公共域(其公有 IP 经过 NAT 映射到内部私有 IP 192.168.0.1)。

我有我的默认 SSL 配置文件像这样

<VirtualHost _default_:443>
        ServerAdmin [email protected]
        ServerName xxx.yyy.com:443
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile      /opt/xxx/cert_xxx.yyy.com.pem
        SSLCertificateKeyFile   /opt/xxx/key_xxx.yyy.com.pem
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </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>

<VirtualHost 192.168.0.1:443>
        ServerAdmin [email protected]
        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile      /opt/xxx/cert_192.168.0.1.pem
        SSLCertificateKeyFile   /opt/xxx/key_192.168.0.1.pem
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </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>

该证书是自签名的,我已将我的 CA 证书导入到浏览器。

但是,只有公共域可以访问,而无需询问证书。当通过内部私有 IP 访问时,我仍然被询问证书(Apache 使用公共域的证书)。

我应该如何配置 Apache 来修复这个问题?

答案1

您的两个 VirtualHosts 所监听的可能都是相同的内容。

尝试使用 NameVirtualhost:(更改 ip/domain 以适合您的设置)

NameVirtualHost 10.11.12.13:443

<VirtualHost 10.11.12.13:443>
  # Are we trying to reach my.domain.tld?
  ServerName my.domain.tld
</VirtualHost>

<VirtualHost 10.11.12.13:443>
  # Are we trying to reach the ip
  ServerName 10.11.12.13
</VirtualHost>

答案2

jusr 重新排序,<VirtualHost>以便<VirtualHost>首先列出内部私有的

(参考:https://httpd.apache.org/docs/current/vhosts/name-based.html

答案3

NameVirtualHost 不适用于 SSL 连接。Apache 首先协商 SSL,然后查看您请求的域(以及哪个 VirtualHost)。

因此,由于它无法区分两个 VirtualHost(两者都对 IP 有效),因此它将始终使用找到的第一个 VirtualHost。因此,您始终会看到公共证书。

修复 1:每个证书分配一个 IP。一个 IP -> 一个虚拟主机 -> 一个证书。

修复2:如果您的浏览器和 Apache 版本支持它,您可以使用 SNI(服务器名称标识)。

相关内容