是否可以在同一主机上运行 HTTPS 应用程序?
例如:
Python FastAPI 后端位于端口 8000,使用 HTTPS。
JS React 前端使用 HTTPS 在端口 4000 上。
如果没有 TLS 代理,它可以工作吗?
我读到一篇博客,主机只能有一个证书,并且只有一个应用程序可以使用 HTTPS。
是否可以在同一主机上运行 HTTPS 应用程序?
例如:
Python FastAPI 后端位于端口 8000,使用 HTTPS。
JS React 前端使用 HTTPS 在端口 4000 上。
如果没有 TLS 代理,它可以工作吗?
我读到一篇博客,主机只能有一个证书,并且只有一个应用程序可以使用 HTTPS。
有两个应用程序 A 和 B。
A用于验证用户身份并将token传递给B,B添加cookie。
每当 cookie 过期或经过很长一段时间或硬浏览器重置后,就会发生奇怪的情况。
没有提琴手:
用户点击应用程序 A 输入凭据并转发到应用程序 B。立即,三秒钟内,浏览器会显示黑色的“xxx 响应时间太长”错误屏幕,然后默认页面“就地”呈现并替换不久之后出现错误屏幕。当 cookie 过期或经过很长一段时间后,就会发生这种情况。
与 Fiddler 一起:(参见第 61、71 和 83 节)
当我在 fiddler 中执行相同的场景时,我希望看到黑色的“xxx 响应时间太长”屏幕,我得到了带有打开锁定图标的证书错误屏幕。我三次都驳回了这一点。当我忽略 ssl 隧道错误时,默认用户页面正在呈现。
相关性大约是在小提琴中的锁定对话框与我得到黑色浏览器错误屏幕的同一位置,并且应用程序似乎正在后台加载,然后在完全加载后刷新。
我的想法是,有一个 https-->http 请求被 A-->B“部分”阻止,因为 B 只是 http,没有证书。开发人员告诉我他们找不到 https 发出的请求。
所以,我无法弄清楚 ssl 隧道来自哪里(请参见屏幕截图)。我的想法是。
The devs missed something and one of the calls is http.
A network appliance is attempting to convert the call to https, though there are no url rewrites on the IIS server.
What would cause a black "xxx took too long to respond" to render while the default page is loading? It feels like a scenario where the request was changed before it was fully read or something like that.
我遵循了此文档,但无法使我的图像通过 HTTPS 提供服务。
我有以下/etc/default/minio
配置文件:
MINIO_ACCESS_KEY="admin"
MINIO_VOLUMES="/usr/local/share/minio/"
MINIO_OPTS="-C /etc/minio --address vps.ovh.net:443 --console-address :9001"
MINIO_SECRET_KEY="secret"
如果我指定另一个端口(例如 9000 而不是 443),这次它可以工作,但该文件是通过 HTTP 提供的:
http://vps.ovh.net:9000/images/product/e53b9fde-4df1-4e54-bef4-76cd8c97cdb2.jpg
我已经在以下位置生成了证书/etc/minio
:
pwd
/etc/minio/certs
ll
rw------- 1 minio-user minio-user 1704 Feb 3 11:05 private.key
-rw-r--r-- 1 minio-user minio-user 5522 Feb 3 11:05 public.crt
有什么想法或建议吗?
正如我在服务器故障上列出的那样,我的网络托管商支持声明如下:
我只是想知道,因此想验证一下,ISP 如何、通过哪种技术可以允许在世界某些地区加载网站,而在其他地区浏览器/客户端会收到 403 错误。
如果你想自己尝试一下:
我创建了一个虚拟 apache 服务器来托管旧的 WordPress,一切都很顺利,直到我尝试通过浏览器上的域访问该页面。
当在浏览器上访问域而不是加载页面时,它会尝试像在谷歌上搜索一样搜索域。
为了暂时解决这个问题,我发现要http://domain-used.old
写入强制其将浏览器重定向到该网址,而不是在谷歌上搜索它。
然而,人们总是抱怨他们需要输入完整的 url(包括 http/https),而切换浏览器却不断执行相同的行为(搜索而不是加载)。
最后,我不得不使用非“.old”的新域名重新部署所有内容。
那么“.old”是对浏览器的限制,还是某些 RFC 中定义的已定义行为?
Spring Boot 应用程序的 HTTP 1.1 和 HTTP 2.0 的流程变化有何不同?
我真的不知道为什么我的 nginx 配置不适用于 www。
我的配置是:
server {
listen 80;
server_name postimg.cz www.postimg.cz;
return 301 https://$server_name$request_uri;
}
server {
listen 443;
server_name postimg.cz;
# SSL Configuration
ssl_certificate /etc/letsencrypt/live/postimg.cz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/postimg.cz/privkey.pem;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GC>
ssl_prefer_server_ciphers on;
# See https://hstspreload.org/ before uncommenting the line below.
# add_header Strict-Transport-Security "max-age=15768000; preload;";
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header Content-Security-Policy "frame-ancestors 'self'";
add_header X-Frame-Options DENY;
add_header Referrer-Policy same-origin;
root /var/www/postimg.cz;
# Disable access to sensitive application files
location ~* (app|content|lib)/.*\.(po|php|lock|sql)$ {
return 404;
}
location ~* composer\.json|composer\.lock|.gitignore$ {
return 404;
}
location ~* /\.ht {
return 404;
}
# Image not found replacement
location ~* \.(jpe?g|png|gif|webp)$ {
log_not_found off;
error_page 404 /content/images/system/default/404.gif;
}
# CORS header (avoids font rendering issues)
location ~* \.(ttf|ttc|otf|eot|woff|woff2|font.css|css|js)$ {
add_header Access-Control-Allow-Origin "*";
}
# PHP front controller
location / {
index index.php;
try_files $uri $uri/ /index.php$is_args$query_string;
}
# Single PHP-entrypoint (disables direct access to .php files)
location ~* \.php$ {
internal;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
}
但是当我去http://www.postimg.cz它不会重定向到https://postimg.cz为什么会这样?你能帮我吗?
服务器:Ubuntu 服务器 20.04
编辑//也试过这个,也不起作用:
server {
listen 80;
server_name www.postimg.cz postimg.cz;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name www.postimg.cz;
ssl_certificate /etc/letsencrypt/live/www.postimg.cz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.postimg.cz/privkey.pem;
return 301 https://postimg.cz$request_uri;
}
server {
listen 443 ssl;
server_name postimg.cz;
我想在我的服务器上为多个站点提供服务。我想将每个站点包装为 docker-compose build,每个站点都有自己的 nginx,它们侦听一个端口
我有一个主机名为 site1.com 的网站。它的 docker compose 暴露了 81 端口:
...
services:
web:
image: nginx
...
ports:
- '81:443'
...
...
客户端 nginx(容器内)监听 443 上的所有内容并拥有所有 ssl 设置
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/fullchain1.pem;
ssl_certificate_key /etc/letsencrypt/privkey1.pem;
# ...
# and everything else
}
这里是主机 nginx,它只是根据 server_name 从端口 80 传递到 81:
server {
listen 80;
listen [::]:80;
server_name site1.com;
location / {
proxy_pass https://localhost:81;
}
}
现在它正在工作。但它是不安全的。所以我尝试添加443转发。
server {
listen 443;
listen [::]:443;
server_name bederdinov.me;
location / {
proxy_pass https://localhost:81;
}
}
Nginx 重启很好,但是当我去的时候我https://site1.com
得到了一个ERR_SSL_PROTOCOL_ERROR
这似乎很明显 - 主机 nginx 正在尝试使用 ssl 服务请求,但只有 docker 客户端 nginx 知道如何做到这一点
我如何告诉主机 nginx,它不必做任何事情,只需将所有工作传递给客户端 nginx?或者我可以使用其他服务器软件来完成这项任务?
[我错误地在stackoverflow上发布了这个问题]
在我的 debian buster 服务器上,我有一个完美运行的 haproxy (v1.8),我用它来管理我的网站的证书。
haproxy 监听 443 端口,并将请求传递给 varnish+apache 系统。
升级到 debian Bullseye 时,haproxy (v2.2) 服务不再启动,并且日志显示:
haproxy[46308]: [ALERT] 048/004148 (46308) : parsing [/etc/haproxy/haproxy.cfg:46] : The 'reqadd' directive is not supported anymore since HAProxy 2.1. Use 'http-r
equest add-header' instead.
负责此行为的 haproxy.cfg 行是
frontend https
# Bind 443 with the generated letsencrypt cert.
bind *:443 ssl crt /etc/letsencrypt/live/qumran2/haproxy.pem
# set x-forward to https
reqadd X-Forwarded-Proto:\ https <-----------|
# set X-SSL in case of ssl_fc <- explained below
http-request set-header X-SSL %[ssl_fc]
# Select a Challenge
acl letsencrypt-acl path_beg /.well-known/acme-challenge/
# Use the challenge backend if the challenge is set
default_backend www-backend
我知道我必须换reqadd X-Forwarded-Proto:\ https
行,但是怎么做?
文档说:
http-request add-header <name> <fmt> [ { if | unless } <condition> ]
This appends an HTTP header field whose name is specified in <name> and
whose value is defined by <fmt> which follows the log-format rules (see
Custom Log Format in section 8.2.4). This is particularly useful to pass
connection-specific information to the server (e.g. the client's SSL
certificate), or to combine several headers into one. This rule is not
final, so it is possible to add other similar rules. Note that header
addition is performed immediately, so one rule might reuse the resulting
header from a previous rule.
我不明白我应该如何写等价的http-request add-header
......
在 nginx.conf 中,我添加了一个 if 子句来过滤基于 cn 的 ssl 连接。
例如
map $ssl_client_s_dn $ssl_client_s_dn_cn {
default "";
~/CN=(?<CN>[^/]+) $CN;
}
server {
listen 80 default_server;
server_name nginx-server;
return 301 https://$server_name$request_uri;
listen 443 ssl;
listen [::]:443 ssl;
server_name nginx-server;
ssl_certificate /path/to/server/cert.pem
ssl_certificate_key /path/to/nginx-server/privatekey.pem
location / {
if ($ssl_client_s_dn_cn !~ "client") {
return 403;
}
root /usr/share/nginx/html;
index index.html index.htm;
}
}
现在从命令行我试图通过提供一个证书来卷曲,该证书的 DN 类似于C=GB,ST=London,L=City,O=MyOrg,OU=myOU,CN=client
我得到 403 错误。
我也尝试使用其他证书,无论证书 DN/CN 是什么,我注意到 Nginx 返回 403。在访问日志中,我尝试将$ssl_client_s_dn
值记录在日志中,但它是空白的。
我从http://nginx.org/en/docs/http/ngx_http_ssl_module.html获取了参考
我在这里想念什么?
更新:
如果我对以下函数中的值进行硬编码以返回客户端,则效果很好:
map $ssl_client_s_dn $ssl_client_s_dn_cn {
default "client";
}
我注意到 ssl_client_s_dn 的值根据 nginx 日志可能为空白。是否与启用 ngx_http_ssl_module 模块有关?
我检查了$ nginx V
我认为该模块已列出。
不知道我错过了什么!请问有什么帮助吗?
谢谢,杰