所以我的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进行?
答案 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。