使用Nginx和Tomcat web应用程序进行TLS客户端身份验证

使用Nginx和Tomcat web应用程序进行TLS客户端身份验证,tomcat,ssl,nginx,tls1.2,Tomcat,Ssl,Nginx,Tls1.2,我有一个Tomcat8Web应用程序,它在服务器的8080端口上运行。任何到端口443的传入请求都将使用Nginx转发到localhost:8080,以服务于web应用程序 我正在尝试设置相互身份验证&然后解析应用程序用于身份验证的客户端证书。然后,应用程序将使用此信息来决定用户是否应该拥有admin或user权限。客户端证书将在公共名称(CN)字段中包含字符串admin或user 我能够实现相互身份验证&下面是当前的nginx ssl.conf,但问题是证书信息没有传递给tomcat web应

我有一个Tomcat8Web应用程序,它在服务器的8080端口上运行。任何到端口443的传入请求都将使用Nginx转发到localhost:8080,以服务于web应用程序

我正在尝试设置相互身份验证&然后解析应用程序用于身份验证的客户端证书。然后,应用程序将使用此信息来决定用户是否应该拥有
admin
user
权限。客户端证书将在公共名称(CN)字段中包含字符串
admin
user

我能够实现相互身份验证&下面是当前的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;
    }
}
您可以使用该指令将附加的头传递给tomcat

可用变量

范例

proxy_set_header SSL_DN $ssl_client_s_dn;
在Java应用程序中,您可以阅读此标题以进行进一步处理

另一方面,我不会将访问级别保存在证书中,而是保存在服务器端数据库中,这样您可以更轻松地重新分配/更改/添加角色或吊销有效的证书

编辑 实际上,nginx还支持证书吊销列表:

关于nginx+php的好文章,可以很容易地适应您的用例:


代理集\头SSL\ DN$SSL\客户端\客户端\ DN确实有效!谢谢。请注意,如果您想要完整的证书,有两个变量:
ssl\u client\u cert
,其中Nginx将用选项卡替换
\n
;还有
ssl\u客户端\u原始\u证书
,它有新行,但会中断您的HTTP连接。使用不起作用(仅替换为空格而不是选项卡),官方的Nginx doc for ssl_client_证书似乎没有提到替换“\n”。只在前面加上了“\t”(但实际上已被替换):这是一篇关于该主题的好文章(以及
\n
问题):