Nginx

如何在 nginx 和應用程序之間的後端正確配置 SSL?

  • October 23, 2020

我正在嘗試在後端配置重新加密,以便 nginx 和上游應用程序之間的流量與使用者和 nginx 之間的流量分開加密。出於測試範例的目的,我使用的是:https ://github.com/jlengstorf/tutorial-deploy-nodejs-ssl-digitalocean-app.git. 我已經閱讀了很多執行緒,但我總是得到錯誤 502:錯誤網關。另外,我不確定它是多麼偏執,甚至為此煩惱。一切都在一個主機上,但我將執行多個服務,我的理由是它們中的任何一個都可能存在漏洞,並且每個應用程序都可以通過不同的證書與 nginx 通信來減輕這種風險。為使範例簡單,我只對 Everything 使用了一個鍵。顯然,如果我真的這樣做,我將為每個重新加密實例製作一個新證書。我是網路託管和考慮安全性的新手,所以如果我在上面說了任何令人毛骨悚然的話,請告訴我。

mydomain.conf

# HTTP — redirect all traffic to HTTPS
server {
   listen 443 ssl;
   server_name 127.0.0.1:5000;
   ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
   root /var/www/html;
   index test_index.html;
   return 301 https://$host$request_uri;
}


# HTTPS — proxy all requests to the Node app
server {
   listen 443 ssl;
   listen [::]:443 ssl;
   server_name mydomain.com;
   root /var/www/html;
   index test_index.html;
   # Use the Let’s Encrypt certificates
   ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
   # Include the SSL configuration from cipherli.st
   include snippets/ssl-params.conf;
   location /app {
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-NginX-Proxy true;
       proxy_pass https://localhost:5000/;
       proxy_ssl_verify on;
       proxy_ssl_trusted_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
       proxy_ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
       proxy_ssl_session_reuse off;
       proxy_set_header Host $http_host;
       proxy_cache_bypass $http_upgrade;
       proxy_redirect off;
   }
}

/var/nginx/error.log 中的相應錯誤:

2020/10/22 16:17:13 [error] 11311#11311: *1 SSL_do_handshake() failed
(SSL: error:1408F10B:SSL routines:ssl3_get_record:wrong version number
) while SSL handshaking to upstream, client: xx.xxx.xx.xx, server: the
3guys.com, request: "GET /app HTTP/1.1", upstream: "https://127.0.0.1:
5000/", host: "mydomain.com"

在 nginx 站點 conf 中包含的 ssl-params.conf 片段中,我設置為使用我知道的所有 TLS 版本:

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;

一般來說,加密在同一主機上執行的服務之間的流量絕對沒有安全優勢。

(本地主機流量只能被對伺服器具有完全訪問權限的攻擊者攔截。當他們可以這樣做時,他們已經可以直接(從文件系統)訪問儲存在您伺服器上的所有數據,並且不需要打擾攔截流量.)

您的錯誤消息似乎表明您嘗試通過從

   proxy_pass http://localhost:5000/;

   proxy_pass https://localhost:5000/;

沒有實際將後端轉換為實際執行 https。

通常,您也不能在同一埠上同時執行 http 和 https 服務。

要通過 https 連接到您的 Node.js 應用程序,您首先需要配置它實際載入證書並開始支持 https。

然後proxy_ssl_verify on可能不是一個好主意,proxy_pass https://localhost因為您無法獲得localhost域名的公共 TLS 證書。

引用自:https://serverfault.com/questions/1039737