我正在尝试在 nginx 中创建代理,但遇到了一个奇怪的问题。我试图创建一个 NGINX 代理,它可以正常工作并忽略所有证书问题、证书问题、可以想象到的证书问题。我只想让它代理流量,无论证书有多糟糕(我知道它很糟糕!)
这是一个非常简单的 nginx 配置,如果我尝试https://www.google.com我可以毫无问题地代理。如果我尝试针对我的真实网站进行代理,我会收到超时错误。无论我向 lynx 或 wget 提供什么选项来忽略证书错误,该网站也无法加载。
有趣的是,该网站在任何典型的浏览器中都可以正常加载,我已经使用 IE、Chrome 和 Firefox 进行了测试。该网站在 openssl s_client 和 curl 中也能正常加载。但 nginx、lynx 和 wget 都认为它们获取的数据不完整,并且会给出“未收到数据”之类的错误。
由于我真正想要的是 NGINX,所以我的配置如下:
server {
listen 443;
server_name funkytown;
ssl_certificate /etc/nginx/cert.crt;
ssl_certificate_key /etc/nginx/cert.key;
ssl on;
location / {
proxy_pass https:// 174.47.225.118/;
#proxy_pass https:// www.google.com;
}
location = /favicon.ico {
return 204;
access_log off;
log_not_found off;
}
}
nginx.conf 只是 nginx 版本的默认设置:nginx/1.4.6(Ubuntu)。这是在 AWS 中运行的 ubuntu 14 的全新安装。我没有理由认为服务器无论如何都很奇怪。
如果有人能帮我弄清楚为什么这个简单的代理不起作用,你就是我的英雄!如果有人能弄清楚为什么这个网站在 lynx 和 wget 中失败,但在 curl 和 openssl 中可以运行,那就加分了。
提前感谢你的帮助!
答案1
总结:我发现服务器端存在多个问题,这些问题可能会导致您看到的问题。如果您有权访问服务器,请尝试在那里修复这些问题。
首先,看起来你的目标主机 (174.47.225.118) 的 SSL 堆栈有点损坏:
- 当使用带有 openssl DEFAULT 密码集的 SSLv23 时,它将成功握手。这将导致 RC4-MD5(由于 RC4 而不好)和 TLSv1。
- 如果使用“ALL”而不是“DEFAULT”,它将使用更好的 DES-CBC3-SHA。
- 但是如果你使用“ALL:!DES-CBC3-SHA”,它就会失败。这很奇怪,因为这个密码集包括以前成功使用的 RC4-MD5。
从这一点来看,它看起来像是一个损坏的堆栈,在某些情况下可能有效,但在其他情况下则无效。但还有更多:
- 当我尝试使用 curl 并禁用证书验证时,它可以运行并获取 HTTP 响应。
- 当我尝试使用禁用证书验证的 wget 时,它会成功进行 SSL 握手并且 wget 会发送请求,但是服务器会在另一次 SSL 握手之后关闭连接而不会发送响应(至少从数据包捕获来看是这样的)。
如果我尝试发送请求,s_client
它看起来就像服务器在发送 HTTP 请求后直接进行重新协商并再次发送其证书。我认为这种意外行为会破坏一些客户端。