首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过SNI提供的主机名myweb.intweb.net和通过HTTP提供的主机名mysecondweb.intweb.net是不同的

通过SNI提供的主机名myweb.intweb.net和通过HTTP提供的主机名mysecondweb.intweb.net是不同的
EN

Server Fault用户
提问于 2018-11-29 17:01:02
回答 2查看 1.5K关注 0票数 0

我已经有一个SSL网站在我的服务器有一段时间没有任何问题,然后我必须添加第二个SSL网站在同一服务器使用相同的端口(4433)。我的配置如下所示:我的服务器中有两个nginx前端和apache后端网站,它们的配置完全相同(服务器名称除外)。

我的问题开始出现,当我点击其中一个网站,然后访问第二个网站时,我会在浏览器中看到以下错误:

您的浏览器发送了此服务器无法理解的请求。

然后,我查看了apache错误日志,并在其中看到了以下错误:

2018年年11月5日16:17:51.247904 pid 18614 AH02032:通过SNI提供的主机名firstwebsite.intweb.net和通过HTTP提供的主机名secondwebsite.intweb.net是不同的

因此,我决定隔离这个问题,看看问题是来自nginx还是apache处理从nginx接收的数据的方式。首先,我尝试在nginx中使用nginx,方法是让nginx位于前端,并使用proxy_pass https://127.0.0.1:44133调用作为后端。

对我来说,问题在于nginx,正如您在下面的curl调用中所看到的,我可以看到,实际上后端sni和后端敌人在我试图点击的第二个网站中由于某种原因不同。

这是证据:

代码语言:javascript
运行
复制
[root@webdev http]# curl -I https://firstwebsite.intweb.net
HTTP/1.1 200 OK
Server: nginx/1.12.0
Date: Thu, 29 Nov 2018 00:08:05 GMT
Content-Type: application/octet-stream
Content-Length: 0
Connection: keep-alive
X-backend-ssl-sni: firstwebsite.intweb.net
X-backend-hostheader: firstwebsite.intweb.net
Strict-Transport-Security: max-age=31536000

[root@webdev http]# curl -I https://secondwebsite.intweb.net
HTTP/1.1 200 OK
Server: nginx/1.12.0
Date: Thu, 29 Nov 2018 00:08:10 GMT
Content-Type: application/octet-stream
Content-Length: 0
Connection: keep-alive
X-backend-ssl-sni: firstwebsite.intweb.net
X-backend-hostheader: secondwebsite.intweb.net
Strict-Transport-Security: max-age=31536000

这种情况也会发生,我的意思是,如果我先调用第二个网站,然后调用第一个网站,我会得到后端-sni和后端竞争对手,第二个网站的值相同,但第一个网站的值不同。如果有类似的缓存或者类似的东西的话。我真的不知道会发生什么。

以下是每个网站的配置文件:

第一个网站conf:https://paste.ngx.cc/9b

第二网站conf:https://paste.ngx.cc/43

在这方面的任何帮助都将不胜感激。

EN

回答 2

Server Fault用户

回答已采纳

发布于 2018-12-11 23:43:00

我能够通过在我的nginx.conf文件中添加这一行代码来解决这个问题:

代码语言:javascript
运行
复制
proxy_ssl_session_reuse off;

显然,OpenSSL中有一个bug。我测试了它,运行了以下代码:

代码语言:javascript
运行
复制
openssl genrsa -out fookey.pem 2048
openssl req -x509 -key fookey.pem -out foocert.pem -days 3650 -subj '/CN=testkey.invalid.example'

openssl s_server -accept localhost:30889 -cert foocert.pem -key fookey.pem -state -servername key1.example -cert2 foocert.pem -key2 fookey.pem

openssl s_client -connect localhost:30889 -sess_out /tmp/tempsslsess -servername key1.example

openssl s_client -connect localhost:30889 -sess_in /tmp/tempsslsess -servername key2.example

观察s_server为这两个请求报告的SNI信息中的key1示例。( TLS分机中的主机名:“.)

如果s_server被重新启动,并且s_client连接/会话被重新运行,那么首先使用key2.样例和key1.样例,在s_server为这两个请求报告的SNI信息中观察key2.样例。

此外,我只是在另一台机器上进行了测试,有时SNI在第二个请求中似乎不存在。

如果s_client筛选会话在选择缓存的会话之前知道SNI信息,那么它应该只选择一个与预期的SNI名称匹配的会话吗?如果它在搜索要重复使用的会话时没有一个SNI名称,那么当它提供(稍后,在连接) SNI信息时,它是不是应该再次检查一下,以确保它在所选择的保存会话中与SNI相同,并且如果它们不同就不使用保存的会话?

在我看来,如果客户端应用程序指定的SNI与服务器看到的SNI不同,那就不好了。

有人报告了使用nginx将代理反向到apache的问题,apache警告说SNI主机名与主机:头不匹配,尽管nginx配置显式地将Host:和apache端SNI设置为相同的内容。

票数 1
EN

Server Fault用户

发布于 2018-12-02 01:11:01

Apache2.2(您所使用的;寿命结束)严格禁止不同的SNI主机名和主机名。Apache 2.4缓解了这种情况,只有在以下情况下才会失败:

“请求不选择SNI选择的虚拟主机,其SSL参数不同”

https://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/ssl/ssl_发动机_kernel.c?view=annotate#l335

如果启用了“保持活动”,则nginx重用后端连接,但您的信任中没有这种功能。

查看nginx源代码,还有其他可能的条件:

代码语言:javascript
运行
复制
         * set u->keepalive if response has no body; this allows to keep
         * connections alive in case of r->header_only or X-Accel-Redirect

解决方案:切换到Apache2.4。

解决办法:不要在前端和后端之间使用https (特别是在您的安装程序中,两者都在同一台机器上)。mod_rpaf和mod_remoteip将有助于向其他apache模块公开“假的”ssl信息。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/942181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档