技术解析
我在 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,或者还是我在哪一方面的配置没有弄好?