【发布时间】:2017-05-26 11:01:56
【问题描述】:
我正在服务器 A 上构建一个网站(已注册域名),供人们创建和运行他们的“应用程序”。
这些“应用程序”实际上是运行在服务器 B 上的 docker 容器,在容器中,有一个可以直接访问的小型 Web 应用程序:
http://IP_ADDR_OF_SERVER_B:PORT
PORT 是一个随机的大数字,它映射到 docker 容器。 现在我可以使 SSL 证书在服务器 A 上运行,以便通过访问它可以正常工作:
https://DOMAIN_NAME_OF_SERVER_A
问题是,我通过访问上面的“http”将“应用程序”包含在 iframe 中,因此我的浏览器(Chrome)拒绝打开它并报告错误为:
Mixed Content: The page at 'https://DOMAIN_NAME_OF_SERVER_A/xxx' was loaded over HTTPS, but requested an insecure resource 'http://IP_ADDR_OF_SERVER_B:PORT/xxx'. This request has been blocked; the content must be served over HTTPS.
那么,我应该如何处理这样的问题呢?
我是一个全栈新手,如果您能分享一些有关如何构建健康的 https 网站的知识,同时以适当的方式解决此类问题,我将不胜感激。
补充说明
好的,我想我只是把问题的大纲扔掉了,这里有更多细节。
我认为使用 https 提供 iframe 请求是完整且直接的,这样就不会再让我感到困惑了。
但问题是,由于所有“应用程序”都是动态创建/删除的,看来我需要为每个应用程序准备许多证书。
自签名证书是否可以正常工作而不会被浏览器阻止或投诉?还是我有办法使用一个 SSL 证书为所有“应用程序”提供服务?
软件环境
服务器 A:运行 node.js 网站,监听 5000 端口并使用 Nginx proxy_pass 提供服务。
server {
listen 80;
server_name DOMAIN_NAME_OF_SERVER_A;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5000;
}
}
server {
listen 443;
server_name DOMAIN_NAME_OF_SERVER_A;
ssl on;
ssl_certificate /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_A.cer;
ssl_certificate_key /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_A.key;
ssl_session_timeout 5m;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:5000;
}
}
服务器 B:运行 node.js 应用程序监听不同的随机大端口号,例如 50055,在创建“应用程序”时动态分配。 (实际上这些应用程序在 docker 容器中运行,而我认为这无关紧要)如果需要可以运行 Nginx。
服务器 A 和 服务器 B 在公共交通中相互交谈。
解决方案
就像所有答案一样,尤其是来自@eawenden 的答案,我需要一个反向代理来实现我的目标。
除此之外,我还做了几件事:
1. 为 Server B 分配一个域名以使用letsencrypt 证书。
2. 将预定义的 url 代理到特定端口。
因此,我在 Server B 上使用 nginx 设置了一个反向代理服务器,代理所有请求,例如:
https://DOMAIN_NAME_OF_SERVER_B/PORT/xxx
到
https://127.0.0.1:PORT/xxx
Ps:Server B
上的nginx反向代理配置server {
listen 443;
server_name DOMAIN_NAME_OF_SERVER_B;
ssl on;
ssl_certificate /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_B.cer;
ssl_certificate_key /etc/nginx/ssl/DOMAIN_NAME_OF_SERVER_B.key;
ssl_session_timeout 5m;
rewrite_log off;
error_log /var/log/nginx/rewrite.error.log info;
location ~ ^/(?<port>\d+)/ {
rewrite ^/\d+?(/.*) $1 break;
proxy_pass http://127.0.0.1:$port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 86400;
}
}
因此,一切似乎都按预期工作!
再次感谢所有回答者。
【问题讨论】:
-
为什么不能使用带有 https 的 iframe 加载应用程序?解决此问题的唯一正确方法是通过 https 加载 iframe 内容。否则,您将面临创建安全漏洞的风险。
-
我想对我的问题添加一些补充说明。
-
太好了,感谢您的解决方案!这是工作!
标签: https server web certificate