我有一个可以通过以下方式访问的 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(服务器名称标识)。