我有一个在 apache2 上运行的网站,客户端通过存储在 USB 驱动器上的 SSL 证书进行身份验证。在客户端和 Web 服务器之间有一个 NGINX 反向代理。
身份验证的工作原理如下:
1)在反向代理上,我设置了两个包含客户端证书序列号和 DN 的自定义标头:
proxy_set_header x-secondary-serial $ssl_client_serial;
proxy_set_header x-secondary-dn $ssl_client_s_dn;
2) 在 Web 服务器上,一些 PHP 代码会检查序列号是否在允许的证书列表中。我已与开发人员核实过序列号在每个页面上是否都经过了验证。
现在,我的问题是,当我拔下 USB 驱动器并继续浏览时,我仍然通过了身份验证。它似乎只有在完全不活动 10 分钟后才会超时(如果我在这 10 分钟之前发起请求,我必须再等 10 分钟才能发生超时,然后页面会要求我插入密钥)。
我检查了日志,发现在移除 USB 驱动器后,每个请求的标题(x-辅助-串行和x-辅助 DN) 仍然填充了正确的值。因此,我考虑了缓存,并尝试将其添加到我的 nginx 服务器块中(但没有成功):
ssl_session_cache off;
我也尝试缩短超时时间(没有成功,而且无论如何,我不太喜欢这个解决方案):
ssl_session_timeout 1m;
我想对每个请求强制进行客户端证书的系统验证(最好在反向代理上,因为这是我最能控制的服务器)。
以下是完整的服务器块:
server {
listen 443;
server_name example.org;
ssl_certificate /etc/ssl/certs/example.org.pem;
ssl_certificate_key /etc/ssl/private/example.org.key;
ssl on;
ssl_session_cache off;
#ssl_session_timeout 1m;
# SSL client authentication
ssl_client_certificate /etc/nginx/ssl/CertEurope_fullchain.crt;
ssl_verify_depth 2;
ssl_verify_client optional;
client_max_body_size 2048m;
proxy_max_temp_file_size 0;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header SSL_PROTOCOL $ssl_protocol;
proxy_set_header x-secondary-serial $ssl_client_serial;
proxy_set_header x-secondary-dn $ssl_client_s_dn;
proxy_read_timeout 90;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
proxy_pass https://10.13.1.1/;
}
}
有人知道如何解决这个问题吗?
问候