近期keycloak、nginx、https杂记

一、keycloak和nginx部署问题

1.问题描述

单独使用keycloak进行sso,在本地可以正常的单点登录。
但部署到nginx,并且经过spring gateway时,却在输入用户名、密码之后抛出401错误码,提示no state cookie。

2.解决思路

经观察,发现正常情况下单点登录的请求url和参数中redirect_url是一致的,而经过nginx和spring gateway之后,请求的url和redirect_url不一样。
由于技术栈不够深,导致一开始想的是改源码,从而使得请求的url和redirect_url保持一致。
虽然源码改了,也实现了url和redirect_url一致,但是依然是401和no state cookie。
最终发现实际并不需要如此麻烦的改源码,只需要使keycloak识别到的request中remoteAddr和请求url一致即可。
于是只需要保证nginx中有ip的转发配置,以及gateway中有隐藏真实ip的配置就可以了。
nginx中必要配置如下:

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forward-For $proxy_add_x_forwarded_for;
proxy_set_header HTTP_X_FORWARDED_FOR $remote_addr; 

以上配置需要注意,如果是经过了多层nginx路由,则层层都要有次配置。

gateway中必要配置如下:
zuul.add-host-header=true

后来有一个header参数转发不了的问题,也需要注意gateway需要如下参数:

zuul:
  sensitive-headers:
  add-proxy-headers: true

二、https请求中客户端和服务端交互流程理解

https请求,根据不同的场景需要,有双向认证和单向认证。
而不论单向还是双向,客户端对服务端证书的处理都有两种方式可选,一是完全信任,即忽略对服务端证书的校验,另一个就是需要校验服务端证书。
根据个人的理解,从一个https请求发起,到真正开始传递业务数据,以nginx作为服务器的大概流程应该如下图,以作记录:
在这里插入图片描述

发布了272 篇原创文章 · 获赞 371 · 访问量 126万+

猜你喜欢

转载自blog.csdn.net/tuzongxun/article/details/100747272