在生产环境中运行时,UI 中的 SignalR 聊天出现 WebSocket 问题,但在本地可以正常工作。我们在后端使用 C#,在 UI 中使用 React。
我检查了服务器日志。存在 SSL 握手问题。我使用 SSL 检查器检查了 SSL 证书的有效性。
但是,我无法在服务器上找到证书和密钥路径。证书和密钥在服务器文件夹中的哪里?请帮助我找到它。提前致谢。
服务器配置:
server{
listen 443;
location / {
proxy_pass http://my_app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location /chatHub {
proxy_pass http://my_app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade" ;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
# Configuration for ServerSent Events
proxy_buffering off;
# Configuration for LongPolling
proxy_read_timeout 100s;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
答案1
正如 @symcbean 在其评论中所述,问题在于 nginx 没有使用 tls。因为你没有正确配置它。你应该告诉它不仅要监听 443,而且还必须是一个 ssl 监听器。然后你必须告诉它在哪里检索 tls 证书和密钥以用于建立 tls 通信。
服务器上放置证书和密钥的路径由你选择:只需注意充分保护私钥,通常只需为 root 用户(主进程使用该用户运行)分配读取权限(400)。
所以,你的配置
server{
listen 443;
location / {
...
应该变成类似
server{
listen 443 ssl;
ssl_certificate <path/to/certificate_file>;
ssl_certificate_key <path/to/key_file>;
location / {
...
其中额外的安全套接字关键字 inlisten 443 ssl;
告诉 nginx 端口 443 上的这个是 TLS 监听器,SSL 证书指令指示从何处获取证书文件和ssl_证书密钥 在哪里获取密钥文件。
如果您使用 yum/dnf 包管理器在 centos/rhel 服务器上安装了 nginx,您可以利用自动创建的文件夹 /etc/nginx/ssl 将证书和密钥放在其中。在配置中,您可以使用相对路径引用它们,例如
server{
listen 443 ssl;
ssl_certificate ssl/<certificate_file>;
ssl_certificate_key ssl/<key_file>;
location / {
...
然后,你应该完善 TLS 通信中使用的协议和密码,例如使用SSL 协议和ssl_密码指令。但这是进一步的步骤,超出了您的具体问题的范围。