nginx 作为上游 SSL 的反向代理

sim*_*dox 30 ssl nginx reverse-proxy

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

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

现在这适用于标准的 http 连接,但我正在尝试弄清楚如何将我们的证书添加到混合中。

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

这甚至可能与 nginx 一起使用吗?有更好的解决方案吗?

我也满足于从客户端的 http -> nginx,以及从 nginx 到 API 的自签名证书。

sho*_*ser 28

对于任何想使用 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
    }
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您设置“proxy_ssl_verify off”,那么 SSL 问题将被忽略(并且不使用 proxy_ssl_trusted_certificate)。要验证来自 backend.server.ip 的证书,proxy_ssl_verify 应为“on”。请参阅http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ssl_verify 另请参阅/sf/ask/2555549671/ (3认同)
  • `proxy_ssl_server_name on;` 是我使用其内置的 Google 管理的 SSL 将流量代理到 Google App Engine 上的主机时所需的全部内容!(这不是自签名证书或任何东西,所以它只需要那一行)。谢谢你的好提示。 (2认同)

Jam*_*Jam 6

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

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可能需要更改的唯一一件事是使“主机”显式 - 例如,如果您的代理主机名与 nginx 代理服务器上使用的主机名不同。

  • 据我了解,是的。在本例中,客户端看到的证书是 nginx 提供的证书。nginx 看到(并验证?我不确定......)服务器提供的信息,但不会将其传递给客户端。 (2认同)

sim*_*dox 5

对于将来遇到此问题的任何人,我最终没有使用 nginx。

相反,我最终在“客户端模式”下使用 stunnel。设置非常简单,并且完全满足我的需要。