我有一个Tomcat 8 Web应用程序,它在服务器上的端口8080上运行。使用Nginx为Web应用程序提供服务的端口443的任何传入请求都转发到localhost:8080。
我正在尝试设置相互身份验证,然后解析应用程序用于身份验证的客户端证书。这些信息将随后由应用程序用来决定用户是否应拥有admin
或user
权利。客户端证书将带有字符串admin
或user
在通用名称(CN)字段中。
我能够实现相互身份验证,以下是当前的nginx ssl.conf,但问题是证书信息未传递到tomcat Web应用程序以解析数据。nginx中是否有一种方法可以传递客户端证书数据,因此tomcat8应用程序可以使用该方法?
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指令将其他标头传递给您的tomcat。
可用变量
http://nginx.org/en/docs/http/ngx_http_ssl_module.html#var_ssl_cipher
例
proxy_set_header SSL_DN $ssl_client_s_dn;
在Java应用程序中,您可以阅读此标头以进行进一步处理。
附带一提,我不会将访问级别保存在证书中,而是保存在服务器端数据库中,这样您可以更轻松地重新分配/更改/添加角色或撤销有效证书。
编辑实际上,nginx也支持证书吊销列表:http : //nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_crl
关于nginx + php的好文章,可以很容易地适应您的用例:
http://nategood.com/client-side-certificate-authentication-in-ngi
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句