nginx 作为带有上游 SSL 的反向代理

nginx 作为带有上游 SSL 的反向代理

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

客户端(仅内部构建、拥有和使用)将通过 SSL 连接到 nginx 框,我在其中使用发送文件在应用程序级别(rails 应用程序)验证凭据。如果凭据有效,则将连接传回 nginx,然后使用 proxy_pass 将连接发送到上游服务器。

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

这个问题几乎与这个,但证书要求比较尴尬。

使用 nginx 是否可行?还有更好的解决方案吗?

我还会解决从客户端到 nginx 的 http,以及从 nginx 到 API 的自签名证书。

答案1

对于任何偶然发现这个问题并想要使用 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 及更高版本。

答案2

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

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

答案3

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

最终,我使用了“客户端模式”的 stunnel。设置起来非常简单,而且完全满足我的需要。

相关内容