我已经有一个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和后端敌人在我试图点击的第二个网站中由于某种原因不同。
这是证据:
[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
在这方面的任何帮助都将不胜感激。
发布于 2018-12-11 23:43:00
我能够通过在我的nginx.conf文件中添加这一行代码来解决这个问题:
proxy_ssl_session_reuse off;显然,OpenSSL中有一个bug。我测试了它,运行了以下代码:
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设置为相同的内容。
发布于 2018-12-02 01:11:01
Apache2.2(您所使用的;寿命结束)严格禁止不同的SNI主机名和主机名。Apache 2.4缓解了这种情况,只有在以下情况下才会失败:
“请求不选择SNI选择的虚拟主机,其SSL参数不同”
如果启用了“保持活动”,则nginx重用后端连接,但您的信任中没有这种功能。
查看nginx源代码,还有其他可能的条件:
* 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信息。
https://serverfault.com/questions/942181
复制相似问题