我的环境
我有带有弹性豆柄的AWS API网关。我想使用客户端证书验证在主机端(弹性豆茎)。弹性豆杆由负载均衡器(ELB)和EC2与NGINX和我的Rails应用程序组成。我在API网关上生成了客户端证书。目前的流动是:
API网关-> (TCP 80) ELB (TCP 80) -> (端口80)主机-> (端口443)
我的问题
我使用以下nginx.conf,尝试进行客户端证书验证:
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 -它来自以下块:
if ($ssl_client_verify != SUCCESS) {
return 403;
}对我来说,奇怪的是,它没有进入任何以前的if语句,没有失败或没有。
如果我移除:
ssl_verify_client on;它还包括:
if ($ssl_client_verify != SUCCESS) {
return 403;
}如果我再次打开ssl_verify_client并删除以下If语句:
if ($ssl_client_verify != SUCCESS) {
return 403;
}所有的东西都是向前传递的--不管我是用证书还是没有证书发送请求。
我的问题
发布于 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端口映射。
发布于 2021-10-04 23:36:12
我目前正在尝试构建一个设置,其中我的API网关正在终止SSL并将客户端证书发送到nginx。经过大量的实验并找到了这个答案,我同意@joakim答案上的评论,您需要配置SSL才能在nginx中通过客户端证书。
https://stackoverflow.com/questions/41810457
复制相似问题