V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
anthoy
V2EX  ›  NGINX

nginx 双重认证跳转错误

  •  1
     
  •   anthoy · 2020-07-22 15:56:42 +08:00 · 1583 次点击
    这是一个创建于 1608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在 nginx 上使用了双向认证,配置如下:

    server {
        listen       443 ssl;
        server_name  localhost;
    
        ssl_certificate    /etc/ssl/server.crt; # 配置证书位置
        ssl_certificate_key /etc/ssl/server.key; # 配置秘钥位置
        ssl_client_certificate /etc/ssl/client.crt; # 客户端公钥证书
        ssl_verify_client on; # 双向认证
    
        charset  utf-8;
        error_log /var/log/nginx/nginx_error.log;
        access_log /var/log/nginx/nginx_access.log;
        client_max_body_size 75M;
        root /usr/share/nginx/html/static;
    
        # 开启 gzip
        gzip on;
        # 启用 gzip 压缩的最小文件,小于设置值的文件将不会压缩
        gzip_min_length 1k;
        # gzip 压缩级别,1-10,数字越大压缩的越好,也越占用 CPU 时间
        gzip_comp_level 6;
        # 进行压缩的文件类型。javascript 有多种形式。其中的值可以在 mime.types 文件中找到。
        gzip_types  application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml text/plain text/css application/javascript application/json  application/x-javascript  application/xml text/javascript;
        # 是否在 http header 中添加 Vary: Accept-Encoding,建议开启
        gzip_vary on;
        # 禁用 IE 6 gzip
        gzip_disable "MSIE [1-6]\.";
    
        location / {
            proxy_pass http://web:8000/;
        }
    }
    

    想使用双向认证访问 443 然后跳转到 docker network 中的 web 的 8000 端口的

    但在使用中跳转不成功,浏览器携带客户端证书访问时会跳转到 https://网关地址

    如果把proxy_pass http://web:8000/;换为proxy_pass https://baidu.com;却可以跳转 所以我认为是使用了双向认证之后导致后面的跳转强制转向 https?

    nginx_access.log 日志如下

    - - [22/Jul/2020:07:51:57 +0000] "GET / HTTP/1.1" 200 84 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
    - - [22/Jul/2020:07:51:58 +0000] "GET / HTTP/1.1" 200 84 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
    - - [22/Jul/2020:07:51:59 +0000] "GET /web HTTP/1.1" 303 227 "https://xxx:443/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"
    

    所以我很好奇是否是双向认证的问题,是否双向认证之后后面的只能走 https,或者还是我在哪一方面的配置没有弄好?

    5 条回复    2020-07-22 16:55:59 +08:00
    brader
        1
    brader  
       2020-07-22 16:06:30 +08:00
    我认为是浏览器的安全策略问题,因为百度的域名证书是合法的,所以跳过去没有触发安全限制。
    你先尝试排除浏览器问题,例如:使用 curl 工具来访问测试,并使用 -k 选项来忽略证书安全验证。
    anthoy
        2
    anthoy  
    OP
       2020-07-22 16:13:43 +08:00
    @brader 使用 curl 如下:
    ```bash
    # 命令
    curl --cert ./client.crt --key ./client.key https://xxx:4443 -k
    # 返回
    <html><head><script>window.location = '/web' + location.hash;</script></head></html>
    ```
    anthoy
        3
    anthoy  
    OP
       2020-07-22 16:25:21 +08:00
    @brader 我用 curl 测试了直接请求某个接口,可以返回 html,应该是你说的浏览器安全策略问题
    anthoy
        4
    anthoy  
    OP
       2020-07-22 16:52:51 +08:00
    已经解决,之前也遇到过这种情况,但这次没有联想起来
    解决办法 https://www.escapelife.site/posts/73685720.html
    byzf
        5
    byzf  
       2020-07-22 16:55:59 +08:00
    推测和双向认证没有关系, 你 https 代理到 http 所以页面认为自己是 http, 所以页面中的跳转也会用 http, 结果就是把 http 的请求发到了 https 的 nginx 上. curl -k 不会走正常的 https 验证流程.

    你在配置里加上
    proxy_redirect http:// https://;
    试试.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3178 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 04:42 · PVG 12:42 · LAX 20:42 · JFK 23:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.