我的理解是,当 Apache 收到对它正在侦听的 TCP 端口之一(例如 80、443)的请求时,它将通过查看 HTTP 标头来决定正在请求哪个主机Host。然后服务器将知道它应该将请求重定向到哪个虚拟主机。
但是它对基于 SSL/TLS 的 HTTP 是如何工作的呢?由于整个 HTTP 请求都被加密(至少我相信我在某处读到过),因此只有在服务器解密数据后才能读取标头信息。但是为了解密,它需要知道要使用哪个密钥对,因为您可以在 Web 服务器上安装多个 SSL 证书。
那么服务器如何知道解密需要哪个密钥呢?
我可以想象 TLS 握手提供了必要的信息。
虽然我同意链接问题的答案和我自己的答案相似,但我必须说问题是不同的。是否或如何使用独立的 SSL 证书托管多个站点是毫无疑问的。相反,我的问题涉及潜在的技术方面。
Web 服务器是否可以根据传入连接的主机标头选择要使用的 SSL 证书,或者该信息是否仅在建立 SSL 连接后可用?
也就是说,我的网络服务器是否可以在端口 443 上列出并在请求https://foo.com 时使用 foo.com 证书,如果请求https://bar.com或我正在尝试使用 bar.com 证书不可能的事情,因为服务器必须在知道客户端想要什么之前建立 SSL 连接?
我正在尝试设置一个 apache-ubuntu-php 网络服务器。我的网络服务器将托管多个 SSL 站点,每个 SSL 站点都有自己的 IP 地址(除非有更好的方法来做到这一点)。
所以我想第一步是让 apache 识别至少两个不同的 IP 地址。现在,我有一个网站的 SSL 和非 SSL 版本,分别是http://mysite.com和https://mysite.com。尽管两者目前都在我的服务器上运行,但我无法让两者都使用不同的 IP 地址。现在,两者都使用 IP 1.1.1.1。我购买了第二个 IP 地址 2.2.2.2,但https://mysite.com不接受它,firefox 抱怨错误“ssl_error_rx_record_too_long”。这是我的 2 个 vhost 文件
/etc/apache2/site-enabled/000-default
#NameVirtualHost 1.1.1.1:80
#<VirtualHost 1.1.1.1:80>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order …Run Code Online (Sandbox Code Playgroud) 当我运行curl命令行
curl "https://example.com"
Run Code Online (Sandbox Code Playgroud)
它立即成功,返回请求的结果。
当我运行相同的 wget 命令时
wget https://example.com
Run Code Online (Sandbox Code Playgroud)
它最终因“无法建立 SSL 连接”而超时。没有任何具体的错误信息。它可以连接,但无法进行 SSL 握手。我试过了,--no-check-certificate但这没有什么区别 - 它似乎与超时有关。
然而:
wget http://example.com
Run Code Online (Sandbox Code Playgroud)
工作正常(HTTP 与 HTTPS)。
这也影响了PHP 的“ file()”方法调用。
我的问题是,什么会导致 curl 成功检索页面(对于我们域中的所有站点)而不是 wget 或 php 解释器?这是周末的新问题,服务器之前很好。
(操作系统为 Red Hat Enterprise Linux 6.4)
Apache 似乎将所有 https 请求路由到第一个,<VirtualHost *:443>而不管 ServerName/ServerAlias 字段上的 SNI 匹配如何。
Apache 使用 SNI
服务器版本构建:Apache/2.2.22 (Ubuntu)
服务器构建:2013 年 3 月 8 日 15:53:13
OpenSSL 1.0.1 2012 年 3 月 14 日
error.log 报告:
Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)
Run Code Online (Sandbox Code Playgroud)
这表明 SNI 正在按照http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI工作(您如何判断您的 Apache 构建是否支持 SNI?)
SSL_TLS_SNI使用 HTTPS 请求时似乎已正确设置(使用 验证phpinfo())
配置:
<IfModule mod_ssl.c>
# If you add NameVirtualHost *:443 here, you will also have to …Run Code Online (Sandbox Code Playgroud) 可能重复:
同一 IP 地址和同一端口上的多个 SSL 域?
我正在开发一个必须使用 HTTPS 的网络应用程序。不过,它的开发成本有点低,我真的不需要(或不想支付)我自己的专用 IP 地址,除了 TLS 需要它。
除此之外,现代 Web 浏览器支持 TLS 的扩展,允许多个域名在单个 IP 后运行。
(感觉就像我们回到了 90 年代中期,当时许多浏览器都支持 HTTP 1.1 Host 标头,但没有足够的支持。)
世界是否准备好接受依赖此 TLS 扩展的网站,还是我应该为专用 IP 付费?
如果我向以下地址发出 HTTP 请求:
https://hello.domain.com
连接也会加密域地址 ( hello.domain.com) 吗?因此,嗅探流量仍然无法猜测请求的 DNS 地址是什么。
注意:我说的是 DNS 地址,而不是解析的 IP 地址。
这听起来可能有点愚蠢,但我更像是一个开发人员而不是服务器管理员,而且我在 IIS 方面非常愚蠢。所以请耐心等待。
我目前有一个客户端,它有一个运行 IIS6 的专用 2K3 框。他们在这个盒子上托管一个站点,有两个域解析到该站点(domain1.com、domain2.com)。该站点存储在典型的 C:\Inetpub\www 文件夹中。此外,该站点还有一部分受 SSL 保护。有两个 SSL 证书,每个域一个。
当用户访问 https:// domain1 时。com,一切都很好。但是,当用户转到 https:// domain2 时。com,Internet Explorer 会发出安全警告。显然,这不是我们想要的。(我不得不在 URL 中添加空格,因为 ServerFault 不允许我一次发布多个 URL,因为我是新来的)。
这里有一些关于 IIS 管理器中站点设置的信息。
这里列出了两个站点,“domain1.com”和“Administration”。当我进入 domain1.com 的属性时,IP 地址的值为“(所有未分配)”。
在“高级”下,列出了“domain2.com”,其 IP 地址为“默认”。此外,在“此网站的多个 SSL 身份”中,有一个条目的 IP 地址为“默认”,标准 SSL 端口为 443。
我可以在“目录安全 > 查看证书”下查看 domain1.com 的证书。那里似乎一切正常。
所以,回顾一下:我正在尝试为指向同一个地方的不同域设置单独的 SSL 证书。这可能吗?如果有人可以向我解释这个过程(并尽可能地将其简化)或至少为我指明正确的方向,我们将不胜感激。
如果这没有任何意义,或者我没有为您提供足够(或正确)的信息,请告诉我。
我正在我的本地系统上测试配置以学习 Apache 配置并使用相同的方法来处理我的生产服务器。
我需要配置两个域example.com和example.org
我有 php 脚本所在的目录:
/server/example.com for example.com 和
/server/example.org for example.org
我在两个目录上运行了这个命令:
sudo chcon -R -h -t httpd_sys_content_t /server/example.*
example.com 中的 index.php 包含
<?
$debug = ($_SERVER['HTTP_HOST'] == 'example.com');
if ($debug) echo "in example.com";
?>
Run Code Online (Sandbox Code Playgroud)
和
example.org 中的 index.php 包含
<?
$debug = ($_SERVER['HTTP_HOST'] == 'example.org');
if ($debug) echo "in example.org";
?>
Run Code Online (Sandbox Code Playgroud)
我还创建了一个名为example.conf下的 apache conf 文件/etc/httpd/conf.d/example.conf
以下是 .conf 文件的内容:
<VirtualHost example.com:81>
DocumentRoot /server/example.com
ServerName example.com
<Directory "/server/example.com">
AllowOverride None
Options All …Run Code Online (Sandbox Code Playgroud) ssl ×7
apache-2.2 ×4
domain ×2
https ×2
sni ×2
tls ×2
virtualhost ×2
web-hosting ×2
curl ×1
iis-6 ×1
linux ×1
ubuntu ×1
web-server ×1
wget ×1