我有多个通过 HTTP 连接的 nodejs web 应用程序服务器,我需要验证发送到这些服务器的请求。我考虑使用 nginx 作为请求的代理,只使用 SSL 证书验证 nginx 服务器,这样发送回客户端的数据/图像就可以通过 HTTPS 提供。
这是我所想到的结构:
+--- app1 ---> node.js on ip:10001
|
client --> https --> nginx --> http --- app2 ---> node.js on ip:10002
|
+--- app3 ---> node.js on ip:10003
我担心的是代理请求的响应对象。基于 Webkit 的浏览器和 Safari 警告我,我的应用程序采用 HTTPS,但通过 HTTP 提供内容(混合内容警告)。
通过认证代理服务器,我对客户端的响应会被验证为 HTTPS 还是 HTTP?
我的 nginx 代理将有一个经过认证的子域名,例如代理域名,因此请求将会被执行,例如“https://proxy.domain.com:10001“。请求是通过 HTTPS 发送给代理的,但返回的服务器内容是通过 HTTP 发送的。代理将如何处理这些返回的内容?
它会应用 SSL 加密吗,因此像这样发回资源:“https://proxy.domain.com:10001/resource.png“
提前感谢大家
答案1
您正在尝试的操作称为 SSL 终止。当反向代理处理 SSL 时,它会使用 HTTP 协议将请求转发到代理服务器。因此,客户端将具有 HTTPS 连接,但从反向代理 (nginx) 到代理服务器 (apache) 将具有 HTTP 连接。在 nginx 中,您可以执行以下操作:
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.chained.crt;
ssl_certificate_key www.example.com.key;
location /{
proxy_pass http://upstream_name:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Scheme $scheme;
}
}
如果你想进一步研究它,你可以使用 Nginx 的官方文档https://www.nginx.com/resources/admin-guide/nginx-ssl-termination/。对于混合内容,我认为我和@Bert 有同样的想法。这可能是因为在 HTML 中您仍然提供 http 协议。