nginx作为上游SSL的反向代理


18

我正在为内部API构建代理,以允许客户端连接而不必安装自签名证书。

客户端(仅在内部构建,拥有和使用)将通过SSL连接到nginx框,在这里我正在使用XSendfile在应用程序级别(Rails应用程序)验证凭据。如果凭据有效,则将连接向上传递回Nginx,在此Nginx使用proxy_pass将连接发送到上游服务器。

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

这个问题几乎与相同,但是证书要求不佳。

nginx甚至有可能吗?有更好的解决方案吗?

我还要从客户端-> nginx中获取http,并从nginx到API获得自签名证书。

Answers:


19

对于任何想使用nginx遇到此问题的人,都可以像设置任何普通代理一样进行设置,并且要接受来自后端的自签名证书,您需要提供导出的pem证书(也许是密钥)并设置ssl验证关。例如:

...

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;在配置中包括它。这适用于nginx 1.7.0及更高版本。


1
proxy_ssl_server_name on;使用内置的Google管理的SSL将流量代理到Google App Engine上的主机时,我所需要做的就是做到这一点!(这不是自签名证书或其他任何东西,因此只需要一行)。感谢您的宝贵建议。
XP84

如果我不使用ssl_certificate,则得到“没有为“ listen ... ssl”指令定义“ ssl_certificate”。是否可以在不提供上游证书的情况下代理SSL?
达米安

评论不在主题之列,因为这是关于代理http连接到上游https的。如果您想代理https,那么最好将其作为一个单独的问题解决。快速而简短的答案是,没有证书和私钥,Nginx不能“监听” https端口。
shonky linux用户

5

我认为您可能想要这样的东西(此示例显然简化了):

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代理服务器上使用的主机名不同。


据我了解,ssl_certificate和ssl_certificate_key参数是指客户端连接,而不是上游连接。是这样吗
simonmaddox

1
据我了解,是的。在此示例中,客户端看到的证书是nginx提供的证书。nginx看到(并验证?我不确定...)服务器提供的那个,但是没有将其传递给客户端。
果酱

3

对于以后遇到此问题的任何人,我最终都没有为此使用nginx。

相反,我最终在“客户端模式”中使用了stunnel。设置非常容易,并且完全满足我的需求。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.