nginx作为上游SSL的反向代理

我正在构build一个内部API的代理,以允许客户端进行连接,而无需安装自签名证书。

客户端(仅在内部构build,拥有和使用)将通过SSL连接到nginx框,我使用XSendfile在应用程序级别validation凭据(一个Rails应用程序)。 如果凭证是有效的,则连接被传回到nginx,在那里它使用proxy_pass将连接发送到上游服务器。

现在,这对于标准的http连接非常有用,但是我正试图弄清楚如何将我们的证书添加到组合中。

这个问题与这个问题几乎相同,但是证书要求很尴尬。

这甚至可以用nginx吗? 有更好的解决scheme吗?

我也解决了客户端的HTTP – > nginx,以及从nginx到API的自签名证书。

对于任何想要使用nginx的问题,你都可以像任何普通的代理一样设置它,并且从后端接受一个自签名证书,你需要提供导出的pem证书(也许是一个密钥)并设置sslvalidationclosures。 例如:

... server { listen 10.1.2.3:80; server_name 10.1.2.3 myproxy.mycompany.com; location / { proxy_pass https://backend.server.ip/; proxy_ssl_trusted_certificate /etc/nginx/sslcerts/backend.server.pem; proxy_ssl_verify off; ... other proxy settings } 

如果您的安全后端正在使用服务器名称标识SNI,并且每个IP /端口对正在服务多个主机,则可能还需要包含proxy_ssl_server_name on; 在configuration中。 这适用于nginx 1.7.0及更高版本。

对于将来遇到这个问题的人来说,我最终没有使用nginx。

相反,我最终在“客户端模式”中使用了stunnel。 非常容易设置,而且确实是我所需要的。

我想你可能想要这样的东西(这个例子显然简化了):

 worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream backend { server mybackendserver:443; } server { server_name localhost; listen 443 ssl; ssl_certificate /etc/nginx/server.crt; ssl_certificate_key /etc/nginx/server.key; ssl_verify_client off; location / { proxy_pass https://backend; proxy_set_header Host $http_host; proxy_set_header X_FORWARDED_PROTO https; } } } 

唯一可能需要更改的是使“主机”明确 – 例如,如果您的代理主机名称与nginx代理服务器上使用的主机名称不同。