SSL证书在后端节点应用程序上无效(Nginx反向代理)

时间:2019-06-06 12:00:20

标签: ssl nginx reverse-proxy lets-encrypt nginx-reverse-proxy

所以我的SSL证书有一些问题。

我在端口80上运行了一个React应用。 以及在端口443上运行的节点后端。

我有一个指向IP(xx.xx.xxx.xx)的域,该IP定向到react应用。我正在使用nginx代理从前端到后端的请求,因为我都在同一服务器上。

这是nginx配置:

server {
  listen 80 ssl;
  server_name xx.xx.xxx.xx;
  ssl_client_certificate /etc/letsencrypt/live/domain.com/cert.pem;
  ssl_certificate /etc/letsencrypt/live/domain.com/cert.pem;
  ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
  root /home/ubuntu/build;
  index index.html;

  access_log /var/log/nginx/build.access.log;
  error_log /var/log/nginx/build.error.log;
  location / {
    try_files $uri /index.html =404;
  }
}

upstream backend {
  server 127.0.0.1:443;
  server 127.0.0.1:443 max_fails=1 fail_timeout=30s backup;
  keepalive 64;
}

server {
  listen 443 ssl;
  server_name xx.xx.xxx.xx;
  ssl_client_certificate /etc/letsencrypt/live/domain.com/cert.pem;
  ssl_certificate /etc/letsencrypt/live/domain.com/cert.pem;
  ssl_certificate_key /etc/letsencrypt/live/domain.com/privkey.pem;
  keepalive_timeout 10;
  location / {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
    proxy_set_header Connection '';
    proxy_set_header Host $host;
    proxy_cache_bypass $http_upgrade;
    proxy_redirect off;
   }
}

向后端提出请求时,我收到以下错误:

  

net :: ERR_CERT_COMMON_NAME_INVALID

这是因为证书对“ domain.com”有效,而不对后端运行的IP有效(我知道您必须对证书使用完全限定的域)。

我的问题是,我可以做些什么(使用nginx)以允许我的请求通过反向代理上的https进行?

1 个答案:

答案 0 :(得分:0)

您使用标准端口80和443的方式有所不同。这些端口是服务器的入口点,不建议用作反向代理中运行的端口。

使用反向代理时,我们会将其他端口映射到端口80或端口443,以便可以分别通过HTTP或HTTPS公开访问这些端口。

如果要通过HTTPS访问所有内容,则需要通过反向代理将react和node应用程序都映射到443,并将所有HTTP访问重定向到HTTPS。

根据建议的修复步骤:

1)使用不同的端口,例如,react为3000,节点为3001。

2)配置用于侦听端口80的服务器块,以重定向到https return 301 https://<yourdomainhere.com>

3)删除端口80服务器块中的ssl行。仅在侦听端口443的服务器块内使用它们

4)修改upstream {}块,以将端口3001用于节点应用程序。保留使用proxy_pass http://backend;,就可以了。

5)在侦听端口443的服务器块内添加带有proxy_pass http://localhost:3000;的新位置块。您现在将有两个位置块,一个用于react,另一个用于node。

6)使用server_name为每个块定义yourdomainhere.com,因为通常不允许使用SSL证书颁发IP地址。我建议使用其他服务器块将IP地址重定向到带有HTTPS前缀的域

7)检查错误,然后重新启动nginx。