Nginx SSL 握手问题

Nginx SSL 握手问题

在生产环境中运行时,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_密码指令。但这是进一步的步骤,超出了您的具体问题的范围。

相关内容