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

OK999

我有一个Tomcat 8 Web应用程序,它在服务器上的端口8080上运行。使用Nginx为Web应用程序提供服务的端口443的任何传入请求都转发到localhost:8080。

我正在尝试设置相互身份验证,然后解析应用程序用于身份验证的客户端证书。这些信息将随后由应用程序用来决定用户是否应拥有adminuser权利。客户端证书将带有字符串adminuser在通用名称(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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用Jersey客户端对Spring Security Web应用程序进行身份验证时,我怎么了?

通过 WCF 服务对 MVC 客户端应用程序进行身份验证和授权?

使用JAX-WS进行客户端应用程序身份验证

客户端服务器和Web应用程序之间的身份验证

使用Angular.js和iOS客户端对Node.js应用程序进行身份验证

如何使用PowerShell对AAD进行身份验证并作为本地客户端应用程序调用Graph API?

Kuberntes入口和客户端身份验证应用程序

如何获得使用带有客户端身份验证的客户端mvc应用程序的SignalR连接的用户的身份?

ADAL无头原生客户端应用程序和多因素身份验证(MFA)

HttpClient未使用客户端证书进行双向TLS身份验证

如何使用客户端证书在Web API中进行身份验证和授权

Caldav(和carddav)兼容的客户端,支持TLS客户端证书身份验证

使用HttpClient进行客户端身份验证

使用其余客户端/ javascript对Microsoft Outlook Web(owa)进行身份验证。

使用客户端身份验证进行Web服务访问:handshake_failure

如果使用多个 UserPool 的“应用程序客户端”,是否需要将它们全部添加到 IdentityPool 的“身份验证提供程序”中?

Tomcat身份验证和特定的Web应用程序身份验证

Identityserver4身份验证-在客户端角度应用程序中处理登录和注册而无需重定向

在我的桌面电子邮件客户端中使用 OAuth 身份验证而不是“应用程序密码”又名“安全邮件密钥”有什么好处?

当用户未分配给客户端应用程序时,使用 ASP.Net Core 的 OKTA 身份验证会引发未处理的异常

在Web应用程序中对用户进行身份验证时,对用户进行身份验证以使用Azure功能

是否建议对面向客户的应用程序使用Azure Active Directory进行身份验证?

使用客户端 ID 和密钥对 Azure Dev Ops 服务客户端库进行身份验证

Spring WS 客户端 — 使用 KeyStore/TrustStore 和凭据进行身份验证(基本身份验证)

Spring集成中的TLS和客户端身份验证

Nextjs + expressjs + Azure Web App:使用 express 进行两因素身份验证('fs' 不能在客户端使用)

使用OpenSSL测试SSL / TLS客户端身份验证

使用golang相互TLS身份验证信任特定客户端

对特定主机使用TLS / SSL客户端身份验证