首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NGINX:客户端证书

问NGINX:客户端证书
EN

Stack Overflow用户
提问于 2017-01-23 15:58:03
回答 2查看 1.7K关注 0票数 4

我的环境

我有带有弹性豆柄的AWS API网关。我想使用客户端证书验证在主机端(弹性豆茎)。弹性豆杆由负载均衡器(ELB)和EC2与NGINX和我的Rails应用程序组成。我在API网关上生成了客户端证书。目前的流动是:

  1. API网关发送请求
  2. 此请求通过弹性负载均衡器(TCP端口80)发送到端口80 (TCP)上的EC2实例。
  3. 在EC2实例中,我让NGINX在Docker中运行。NGINX容器监听端口443,该端口绑定到主机的端口80。

API网关-> (TCP 80) ELB (TCP 80) -> (端口80)主机-> (端口443)

我的问题

我使用以下nginx.conf,尝试进行客户端证书验证:

代码语言:javascript
复制
user  root;

error_log  /var/log/app-nginx-error.log debug;
pid        /var/run/app-nginx.pid;

events {
    worker_connections  8096;
    multi_accept        on;
    use                 epoll;
}

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" "$ssl_client_cert"';

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

    sendfile           on;
    tcp_nopush         on;
    tcp_nodelay        on;
    keepalive_timeout  10;

    upstream appserver {
      server unix:///var/run/puma.sock;
    }

    server {
      listen 443 default_server;
      root /var/www/public;
      client_max_body_size  16m;

      ssl_trusted_certificate /etc/nginx/ssl/api-gateway.pem;
      ssl_client_certificate /etc/nginx/ssl/api-gateway.pem;
      ssl_verify_client on;

      ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
      ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
      ssl_prefer_server_ciphers on;

      if ($ssl_client_verify = FAILED) {
        return 495;
      }

      if ($ssl_client_verify = NONE) {
        return 402;
      }

      if ($ssl_client_verify != SUCCESS) {
        return 403;
      }

      location ^~ /assets/ {
        gzip_static on;
        expires max;
        add_header Cache-Control public;
      }

      try_files $uri/index.html $uri @appserver;
      location @appserver {
        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-Host $server_name;
        proxy_set_header  Client-IP $remote_addr;
        proxy_pass        http://appserver;
        proxy_set_header X-Client-Verify $ssl_client_verify;
      }

      access_log    /var/log/app-nginx-access.log;
      error_log     /var/log/app-nginx-error.log debug;
      error_page    500 502 503 504 /500.html;
    }
}

但是,当我使用API网关发送证书测试它时,它总是返回403 -它来自以下块:

代码语言:javascript
复制
 if ($ssl_client_verify != SUCCESS) {
    return 403;
  }

对我来说,奇怪的是,它没有进入任何以前的if语句,没有失败或没有。

如果我移除:

代码语言:javascript
复制
 ssl_verify_client on;

它还包括:

代码语言:javascript
复制
 if ($ssl_client_verify != SUCCESS) {
    return 403;
  }

如果我再次打开ssl_verify_client并删除以下If语句:

代码语言:javascript
复制
 if ($ssl_client_verify != SUCCESS) {
    return 403;
  }

所有的东西都是向前传递的--不管我是用证书还是没有证书发送请求。

我的问题

  1. 我的nginx.conf还好吗?(也许我把TCP / HTTP混合在一起了?)
  2. 是否有任何方法可以获得更多关于NGINX的详细信息(有证书吗?),ssl_verify_client的结果是什么,以及任何可以帮助检测问题的方法?
EN

回答 2

Stack Overflow用户

发布于 2017-01-25 03:08:41

我可能搞错了,但这看起来像是你的安排

API网关-> (TCP 80) ELB (TCP 80) -> (端口80)主机-> (端口443) NGINX容器

也许应该是

API网关-> (TCP 80) ELB (TCP 443) -> (端口443) NGINX容器-> (端口80)主机

也就是说,nginx应该坐在你的应用程序前面,而不是它后面。

实际上,在配置文件中,您并没有将nginx的端口443代理到应用程序的端口80。你在那里找不到一个proxy_pass或类似的东西。

您还提到了码头,您使用的是多容器环境还是单个容器环境?如果是前者,你应该(可以吗?)在Dockerrun.aws.json文件中指定nginx-app端口映射。

票数 1
EN

Stack Overflow用户

发布于 2021-10-04 23:36:12

我目前正在尝试构建一个设置,其中我的API网关正在终止SSL并将客户端证书发送到nginx。经过大量的实验并找到了这个答案,我同意@joakim答案上的评论,您需要配置SSL才能在nginx中通过客户端证书。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41810457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档