如何将用户证书从 NGINX 反向服务器传递到运行 NGINX 的其他服务器?

如何解决如何将用户证书从 NGINX 反向服务器传递到运行 NGINX 的其他服务器?

我总共有两个独立的服务器,ServerA 和 ServerB。 ServerA 使用 Docker/Docker-Compose 作为 NGINX 反向代理服务器。

这里是 ServerA 的 docker-compose.yml 文件:

version: '3.5'
services:
  proxy:
    build: ./
    # image: nginx:1.19-alpine
    container_name: proxy
    ports:
      - 80:80
      - 443:443
    restart: unless-stopped

这是 Dockerfile 的内容:

FROM nginx:1.19.0-alpine

# Remove default configuration
RUN rm /etc/nginx/nginx.conf
RUN rm /etc/nginx/conf.d/default.conf

# New default conf containing the proxy config
COPY ./default.conf /etc/nginx/conf.d/default.conf
COPY ./nginx.conf /etc/nginx/nginx.conf

# Backend not found html response
COPY ./backend-not-found.html /var/www/html/backend-not-found.html

# Nginx Proxy and SSL shared configs
COPY ./includes/ /etc/nginx/includes/

这里是nginx conf的内容,nginx.conf:


user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  4096;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

代理的主要配置来自这个文件,default.conf:

# 80 Redirect
server {
    listen 80;
    listen [::]:80;

    server_name localhost $host;

    return 301 https://$host$request_uri;
}

# ServerB proxy config for app running on port 443.
server {
    listen 443 ssl;
    server_name App1.CUSTOMDOMAIN.org;

    # Configure SSL
    ssl_certificate /etc/ssl/certs/nginx/ServerA-crt.pem;
    ssl_certificate_key /etc/ssl/certs/nginx/ServerA-key.pem;
    ssl_trusted_certificate        /etc/ssl/certs/nginx/PKI/ca.ca-bundle;
    ssl_client_certificate         /etc/ssl/certs/nginx/PKI/ca.ca-bundle;
    ssl_verify_client optional;
    ssl_verify_depth 5;
    include /etc/nginx/includes/ssl.conf;

    location / {
        include /etc/nginx/includes/proxy.conf;
        proxy_pass https://ServerB.CUSTOMDOMAIN.org;
        proxy_ssl_certificate           /etc/ssl/certs/nginx/ServerA-crt.pem;
        proxy_ssl_certificate_key       /etc/ssl/certs/nginx/ServerA-key.pem;
    }


    access_log off;
    error_log  /var/log/nginx/error.log error;
}

# ServerB proxy config for app running on port 8000.
server {
    listen 443 ssl;
    server_name App2.CUSTOMDOMAIN.org;

    # Configure SSL
    ssl_certificate /etc/ssl/certs/nginx/ServerB-crt.pem;
    ssl_certificate_key /etc/ssl/certs/nginx/ServerB-key.pem;
    ssl_trusted_certificate        /etc/ssl/certs/nginx/PKI/ca.ca-bundle;
    ssl_client_certificate         /etc/ssl/certs/nginx/PKI/ca.ca-bundle;
    ssl_verify_client optional;
    ssl_verify_depth 5;
    include /etc/nginx/includes/ssl.conf;

    location / {
        include /etc/nginx/includes/proxy.conf;
        proxy_pass https://ServerB.CUSTOMDOMAIN.org:8000;  # DEV
        proxy_ssl_certificate           /etc/ssl/certs/nginx/ServerB-crt.pem;
        proxy_ssl_certificate_key       /etc/ssl/certs/nginx/ServerB-key.pem;
    }

    access_log off;
    error_log  /var/log/nginx/error.log error;
}

# Catch all
server {
    listen 80 default_server;

    server_name _;
    root /var/www/html;

    charset UTF-8;

    error_page 404 /backend-not-found.html;
    location = /backend-not-found.html {
        allow   all;
    }
    location / {
        return 404;
    }

    access_log off;
    log_not_found off;
    error_log  /var/log/nginx/error.log error;
}

App1.CUSTOMDOMAIN.org 和 App2.CUSTOMDOMAIN.org 是指向 NGINX 反向代理 (ServerA) 的 DNS 记录。根据用户访问的 DNS/URL,它将代理将用户传递到端口 443 或 8000 上的 ServerB。

ServerB 在 docker-compose.yml 文件中运行 nginx + django + 本地 postgresdb:

version: '3'

services:
  app-rest:
    container_name: app-rest
    env_file:
      - ./.env
    environment:
      - DJANGO_SETTINGS_MODULE=app.settings.local
    build:
      context: .
      dockerfile: Dockerfile
      args:
        - CA_BUNDLE=${SERVER_CA_BUNDLES}
    volumes:
      - ${REST_DIR}:/app
      - static_volume:/app/staticfiles
      - media_volume:/app/mediafiles
      - ${SERVER_PRIVATE_KEY}:/app/certs/private.pem
      - ${SERVER_PUBLIC_CERT}:/app/certs/public.pem
      - ${SERVER_PEM}:/app/certs/server.pem
      - ${SERVER_CA_BUNDLES}:/app/certs/ca/ca.pem
    command: python manage.py runserver 0.0.0.0:8000
    # command: gunicorn app.wsgi:application --bind 0.0.0.0:8000
    expose:
      - 8000
    restart: unless-stopped

  # nginx reverse-proxy
  nginx:
    env_file:
      - ./.env
    build: ./nginx
    volumes:
      - static_volume:/app/staticfiles
      - media_volume:/app/mediafiles
      - ${SERVER_PRIVATE_KEY}:/etc/nginx/private.pem
      - ${SERVER_PUBLIC_CERT}:/etc/nginx/public.pem
      - ${SERVER_CA_BUNDLES}:/etc/pki/tls/certs/ca_bundles.pem
      - ${UI_DIR}./dist:/var/www/app
    ports:
      - 80:80
      - 443:443
    depends_on:
      - App-rest
    restart: unless-stopped

  # optional local database instance
  local-db:
    container_name: App-local-db
    image: postgres:13.1-alpine
    env_file:
      - ./.env
    environment:
      - POSTGRES_PASSWORD=${PG_DB_PASSWORD}
      - POSTGRES_DB=${PG_DATABASE}
    ports:
      - ${PG_DB_EXT_PORT}:5432
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    restart: unless-stopped

volumes:
  postgres_data:
  static_volume:
  media_volume:

我想弄清楚当用户点击 App1.CUSTOMDOMAIN.org 到 ServerB.CUSTOMDOMAIN.org 上的其他 nginx 代理服务器时,我如何将用户证书移交给它。现在,ServerA 的服务器证书似乎正在传递给 ServerB.CUSTOMDOMAIN.org 而不是用于与 DJANGO 进行身份验证的用户证书。

这是ServerB的nginx服务器的另一个nginx.conf:

upstream rest {
    server app-rest:8000;
}

server {
    listen 80;
    listen [::]:80;

    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    keepalive_timeout 70;

    ssl_protocols               TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate             /etc/nginx/public.pem;
    ssl_certificate_key         /etc/nginx/private.pem;
    ssl_client_certificate      /etc/pki/tls/certs/ca_bundles.pem;
    ssl_verify_client           on;
    ssl_verify_depth            2;
    ssl_session_cache           shared:SSL:10m;
    ssl_session_timeout         10m;

    location /api/app {
        proxy_pass              http://rest/api/app;
        proxy_set_header        X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header        Host                $host;
        proxy_set_header        X-Forwarded-Proto   $scheme;
        proxy_set_header        X-SSL-Client-Verify $ssl_client_verify;
        proxy_set_header        X-SSL-Client-S-DN   $ssl_client_s_dn;
        proxy_set_header        X-SSL-Client-I-DN   $ssl_client_i_dn;
        proxy_redirect          off;
    }

    location / {
        root        /var/www/app;
        try_files   $uri $uri/ /index.html;
    }

    location /staticfiles/ {
        alias /app/staticfiles/;
    }

    location /mediafiles/ {
        alias /app/mediafiles/;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res