如何配置通过nginx代理访问mTLS让浏览器自动提示证书?

问题描述 投票:0回答:0

我在代理 nginx 服务器后面设置了一个 mTLS 服务器,当通过 curl 或其他可以明确指定证书以启动与服务器的连接的客户端使用时,它工作正常。但是,当尝试通过 Internet 浏览器(尝试使用 Chrome、Firefox)连接到服务器时,浏览器不会提示连接证书并直接跳转到错误页面,因为缺少客户端证书。尝试通过浏览器连接时似乎存在握手/协议问题。任何人都可以帮助解决问题吗?

我在下面提供了服务器和代理的最小配置:

nginx代理服务器写成一个nginx模块在modules-enabled文件夹下为nginx as

stream {
    map $ssl_preread_server_name $name {
        hostnames;
        serverA.mydomain.com server_A;
        *.mydomain.com url_backend;
    }
    upstream url_backend {
        server 127.0.0.1:1234;
    }

    upstream server_A {
        server serverA.mydomain.com:3456;
    }
    server {
        listen 443;
        listen [::]:443;
        ssl_preread on;
        proxy_pass $name;
        proxy_buffer_size 10m;

        ssl_verify_client on;
        ssl_verify_depth 2;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers   HIGH:!aNULL:!MD5;
        ssl_client_certificate /etc/nginx/PATHTOMYCA.crt;
        proxy_ssl_verify on;
    }
}

我有一个 nginx 配置,使用写在 nginx/sites-enabled 文件夹中的 mTLS 为 serverA.mydomain.com 提供内容

server {
    if ($host = serverA.mydomain.com) {
        return 301 https://$host$request_uri;
    } 
    listen 80;
    server_name serverA.mydomain.com;

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

server {
    listen 3456 ssl;
    server_name serverA.mydomain.com;
    ssl_certificate /etc/serverA.mydomain.com/fullchain.pem; 
    ssl_certificate_key /etc/serverA.mydomain.com/privkey.pem; 
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers   HIGH:!aNULL:!MD5;
    proxy_set_header X-SSL-CERT $ssl_client_escaped_cert;
    
    ssl_client_certificate /etc/nginx/PATHTOMYCA.crt;
    ssl_verify_client on;
    ssl_verify_depth 2;    

    location / {
        if ($ssl_client_verify != SUCCESS) {return 403;}
        root /home/serverAhome;
        index index.html;
     }
}

如果我尝试通过 curl as 访问 serverA.mydomain.com

curl https://serverA.mydomain.com --cert validclient.crt --key validkey.crt

我得到了一个成功的响应,其中包含预期的 index.html 文件的 HTML 内容。如果我尝试在不提供证书和密钥文件的情况下使用 curl,我会收到一条包含消息“400 错误请求:未发送必需的 SSL 证书”的错误 HTML。

当我尝试通过 Web 浏览器访问 https://serverA.mydomain.com 时,我直接进入 HTML 页面并显示错误“400 错误请求:未发送必需的 SSL 证书”。如果 mTLS 设置正确,我的理解是浏览器应该提示用户提供有效的客户端证书文件。但是,浏览器没有发出这样的提示。 (这不是浏览器缓存问题,因为我曾尝试在各种计算机上使用浏览器访问它,即使以前从未访问过该网站,我也会得到相同的错误响应)。

任何用于调查/调试或解决方案的指示都将不胜感激。

security nginx ssl nginx-reverse-proxy mtls
© www.soinside.com 2019 - 2024. All rights reserved.