我在代理 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 设置正确,我的理解是浏览器应该提示用户提供有效的客户端证书文件。但是,浏览器没有发出这样的提示。 (这不是浏览器缓存问题,因为我曾尝试在各种计算机上使用浏览器访问它,即使以前从未访问过该网站,我也会得到相同的错误响应)。
任何用于调查/调试或解决方案的指示都将不胜感激。