nginx proxy_ssl_verify on; error upstream SSL certificate verify error: (18:self-signed certificate) while SSL handshaking to upstream ....
用 nginx 作反向代理时,如果 proxy_ssl_verify 设置为 off,最不容易出问题导致 nginx 跑不起来;但这样配置会有安全风险,非常不建议关闭证书验证功能。
配置了 proxy_ssl_verify on; 后,需要使用 proxy_ssl_trusted_certificate 配置证书颁发机构(CA)的可信根证书,如果根证书和证书颁发机构不匹配,会出现 self-signed certificate 的错误,此时服务器证书被当成了自签证书,证书验证过程会失败。如果服务器证书由 Let's Encrypt 签发,应该将 ISRG Root X1 和/或 ISRG Root X2 可信根证书保存到 proxy_ssl_trusted_certificate 指定的文件中;由于服务器的证书可能由各种各样的颁发机构颁发,最好使用一个包含了各种可信证书签发机构根证书的通用文件,比如 curl 附带的 curl-ca-bundle.crt。
除了配置 proxy_ssl_trusted_certificate 还要启用 SNI 扩展,SNI 全称是 Server Name Indication。- proxy_ssl_server_name on;
复制代码 如果 proxy_pass 使用的是 IP 地址或另一个服务域名(server name),而不是实际要代理访问的服务域名,还要配置用来验证主机名的服务域名。
比如代理服务器和后端服务器使用的是相同的服务域名,而代理服务器和后端服务器又不在一台设备上 IP 地址也互不相同;此时可以在公网上将这个域名解析到代理服务器,在代理服务器上用 IP 地址 + Host 请求头来访问后端服务器;也可以用另一个主机记录解析到后端服务器,在代理服务器上用这个额外的主机记录 + Host 请求头访问后端服务器。
- proxy_ssl_name www.wuxiancheng.cn;
复制代码 整合后的配置如下。- location / {
- proxy_http_version 2;
- proxy_pass https://qsez.org;
- proxy_set_header host www.wuxiancheng.cn;
- proxy_set_header user-agent $http_user_agent;
- proxy_ssl_verify on;
- proxy_ssl_server_name on;
- proxy_ssl_name www.wuxiancheng.cn;
- proxy_ssl_trusted_certificate ssl/www.wuxiancheng.cn/ca.crt;
- }
复制代码 这里的技巧是:
qsez.org 只是用来解析后端服务器的 IP 地址,而不是后端服务器的真实服务域名;
host 请求头告诉后端服务器实际上要访问的服务域名;
proxy_ssl_name 指明要在服务器证书中检查的服务域名;
proxy_ssl_trusted_certificate 指定受信任的证书颁发机构根证书。
有了以上配置,代理服务器可以接收客户端向服务域名发来的请求,然后将请求发到后端服务器让后端服务器处理同一个域名上的请求。
一些注意事项——
proxy_http_version 配置的 HTTP 协议版本不能高于被代理服务器支持的最高版本。
上面只给出了关键配置;其他配置被省略了,需要根据实际情况补齐。 |
|