我有一个 Tomcat 8 的 web 应用程序,它在服务器上的端口 8080 上运行。任何对端口 443 的传入请求都将使用 Nginx 转发到 localhost:8080,以提供 Web 应用程序服务。
我正在尝试设置双向身份验证,并解析应用程序用于身份验证的客户端证书。然后,应用程序将使用此信息来确定用户是否应具有“管理员”或“用户”权限。客户端证书将在公共名称(CN)字段中带有字符串“管理员”或“用户”。
我能够实现双向身份验证,以下是当前的 nginx ssl.conf。但问题是证书信息未传递给 Tomcat Web 应用程序来解析数据。在 Nginx 中是否有一种可用的方法来传递客户端证书数据,以便 Tomcat 8 应用程序可以使用它?
我正在尝试设置双向身份验证,并解析应用程序用于身份验证的客户端证书。然后,应用程序将使用此信息来确定用户是否应具有“管理员”或“用户”权限。客户端证书将在公共名称(CN)字段中带有字符串“管理员”或“用户”。
我能够实现双向身份验证,以下是当前的 nginx ssl.conf。但问题是证书信息未传递给 Tomcat Web 应用程序来解析数据。在 Nginx 中是否有一种可用的方法来传递客户端证书数据,以便 Tomcat 8 应用程序可以使用它?
server {
listen 443 default_server;
server_name name.domain.com;
ssl on;
ssl_certificate /etc/nginx/self-signed.pem;
ssl_certificate_key /etc/nginx/self-signed.pem;
ssl_protocols SSLv2 TLSv1 TLSv1.1 TLSv1.2;
ssl_client_certificate /etc/nginx/ca.cert.pem;
ssl_verify_client optional;
ssl_verify_depth 2;
ssl_session_timeout 5m;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
port_in_redirect off;
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;
#test page for the load balancer
location /loadbalancer {
add_header X-Frame-Options "DENY";
auth_basic off;
#proxy_pass http://localhost:8080;
try_files $uri /test.html;
}
location /webapi {
add_header X-Frame-Options "DENY";
auth_basic off;
proxy_pass http://localhost:8080;
}
location / {
if ($ssl_client_verify != SUCCESS)
{
return 403;
break;
}
add_header X-Frame-Options "DENY";
proxy_pass http://localhost:8080;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
proxy_set_header SSL_DN $ssl_client_s_dn;
确实有效!谢谢。 - OK999ssl_client_cert
,其中Nginx将用制表符替换\n
;而ssl_client_raw_cert
具有换行符但会中断您的HTTP连接。使用官方Tomcat SSL阀门无法工作(仅替换为空格而不是制表符)。 - lucasvc\n
问题)的好文章: https://blog.perplexedminds.com/2015/04/nginx-apache-tomcat-certificate.html - Martynas Jusevičius