【问题标题】:Pass certificate from Ngnix Server to other Nginx Server for client authentication将证书从 Nginx 服务器传递到另一个 Nginx 服务器以进行客户端身份验证
【发布时间】:2017-08-25 10:22:59
【问题描述】:

我有一个 Ngnix 服务器 [Frond End say xx.xx] 和其他 Ngnix 服务器 [Other Backend Server say yy.yy]

如果使用 curl 命令我在 yy.yy 服务器上传递客户端证书和密钥,我会从后端服务器获得成功

问题: 如果使用 curl 命令,我在 xx.xx 服务器上传递客户端证书和密钥,我收到错误

400 错误请求

未发送所需的 SSL 证书

所以在我的情况下 xx.xx 没有将证书传递给 yy.yy 服务器

请帮帮我

对于 yy.yy 服务器

server {
    listen       443;

    server_name  yy.yy
    ssl on;
    ssl_certificate     /etc/yyyycert.pem;
    ssl_certificate_key /etc/yy.key;
    ssl_client_certificate /etc/ca-chain-scb.cert.pem;   
    ssl_verify_client on;
    location / {
        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-User     $remote_user;
        proxy_pass http://127.0.0.1:8080;
        }
}

server {
    listen       443;

    server_name  xx.xx
    ssl on;
    ssl_certificate     /etc/xxxx.pem;
    ssl_certificate_key /etc/xx.key;
    ssl_verify_client on;
    location ~ ^/SCB/(.*)$  {
        proxy_set_header X-SSL-CERT $ssl_client_cert;
        rewrite /SCB(.*) $1  break;
        proxy_pass https://yy.yy:443;
    }
}

【问题讨论】:

  • 发布你的 nginx 配置
  • 对于 xx.xx 服务器服务器 { 听 443; server_name xx.xx;开启ssl; ssl_certificate /etc/xx.cert.pem; ssl_certificate_key /etc/xx.key;位置 ~ ^/SCB/(.*)$ { proxy_set_header X-SSL-CERT $ssl_client_cert;重写 /SCB(.*) $1 break; proxy_pass yy.yy:443; } }
  • 发布有问题的内容,而不是在 cmets 中。并发布双方配置
  • 对于 yy.yy 服务器服务器 { 听 443; server_name yy.yy ssl on; ssl_certificate /etc/yyyycert.pem; ssl_certificate_key /etc/yy.key; ssl_client_certificate /etc/ca-chain-scb.cert.pem; ssl_verify_client 开启;位置 / { proxy_set_header 主机 $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-User $remote_user; proxy_pass 127.0.0.1:8080; } }
  • 塔伦也做了同样的事情

标签: linux nginx openssl ssl-certificate reverse-proxy


【解决方案1】:

后端服务器正在生成 400 错误,因为它从未收到任何客户端证书。所有传入的 SSL 会话都将在反向代理处终止。然后反向代理创建一个新会话以连接到后端。通常,代理在尝试连接时不会发送客户端证书,因此会出现错误。

如果您想在使用反向代理的情况下在后端强制执行客户端证书身份验证,您可以在反向代理服务器上使用指令proxy_ssl_certificateproxy_ssl_certificate_keyproxy_ssl_verify。这些将使代理使用自己的客户端证书向后端进行身份验证。这与后端接收和验证原始客户端证书不同,因为它们不会在与后端的连接中传递。

如果您需要将原始客户端证书信息传递给后端,您可以在连接到后端时通过在请求标头中发送变量$ssl_client_cert 来实现。 This page 有一个使用各种证书属性的示例。请注意,这仍然与后端验证原始客户端证书不同,但可以使用类似的效果,假设后端信任反向代理,反之亦然。

目前,后端服务器无法在反向代理后面验证​​原始客户端证书。这不是 Nginx(或 Apache)的限制,而是由于 SSL 在使用客户端证书身份验证时的工作方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 2012-06-10
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多