You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EC2上Node.ts+Docker+Nginx环境下mTLS强制认证实现咨询

解决Nginx反向代理下的mTLS配置问题

一、配置Nginx要求客户端提供证书(实现mTLS)

要让Nginx验证客户端证书,需完成以下步骤:

  1. 准备CA根证书
    你需要用CA根证书签发客户端证书,若没有CA证书,可通过openssl生成:

    # 生成CA私钥(设置密码)
    openssl genrsa -des3 -out ca.key 2048
    # 生成CA根证书(有效期10年)
    openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
    
  2. 部署证书到Nginx环境

    • 若Nginx直接运行在EC2:将ca.crt、服务器证书(server.crt)和私钥(server.key)放到/etc/nginx/ssl/目录。
    • 若Nginx用Docker部署:在docker-compose.yml中挂载本地证书目录到容器内,示例:
      services:
        nginx:
          image: nginx:alpine
          ports:
            - "443:443"
          volumes:
            - ./nginx.conf:/etc/nginx/nginx.conf
            - ./ssl:/etc/nginx/ssl # 本地ssl目录包含所有证书文件
          depends_on:
            - node-service
      
  3. 修改Nginx配置开启客户端证书验证
    在nginx.conf的server块中添加mTLS相关配置:

    server {
        listen 443 ssl;
        server_name your-domain.com;
    
        # 服务器SSL证书配置
        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;
    
        # 开启mTLS验证
        ssl_client_certificate /etc/nginx/ssl/ca.crt; # 用于验证客户端证书的CA根证书
        ssl_verify_client on; # 强制要求客户端提供有效证书
        ssl_verify_depth 1; # 验证证书链的深度(仅验证直接由CA签发的证书)
    
        # 转发请求到后端Node.ts服务
        location / {
            proxy_pass http://node-service:3000; # 替换为你的Node服务地址和端口
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    

    配置完成后重启Nginx(Docker环境下执行docker-compose restart nginx)。

二、强制用户使用mTLS访问服务

通过以下方式确保只有提供有效客户端证书的请求才能访问服务:

  1. 强制验证客户端证书
    保持Nginx配置中的ssl_verify_client on,此时未提供有效证书的请求会直接返回403 Forbidden,拒绝访问。

  2. 强制HTTPS访问
    mTLS依赖HTTPS,需拦截所有HTTP请求并跳转至HTTPS,添加如下server块:

    server {
        listen 80;
        server_name your-domain.com;
        return 301 https://$host$request_uri;
    }
    
  3. 可选:针对特定路径强制mTLS
    若仅部分接口需要mTLS验证,可在location块中单独配置:

    # 仅/api/secure路径强制mTLS
    location /api/secure {
        ssl_verify_client on;
        proxy_pass http://node-service:3000/api/secure;
    }
    
    # 其他路径无需强制验证
    location / {
        ssl_verify_client optional;
        proxy_pass http://node-service:3000;
    }
    
  4. 提供便于用户导入的证书格式
    将客户端证书和私钥打包成.p12格式(支持浏览器、移动端等导入),命令如下:

    openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt
    

    用户导入该文件后,访问服务时客户端会自动出示证书完成验证。

内容的提问来源于stack exchange,提问作者Roy Gebrayel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:05:17