系列目录
(一)keycloak 部署运行及源码打包
(二)keycloak 配置运行
(三)keycloak 基于SpringBoot、Servlet的客户端开发
(四)keycloak 自定义用户(SPI)开发
(五)keycloak 自定义主题
(未完成)(六)keycloak 添加登录验证码功能
(七)keycloak 设置客户端访问类型 bearer-only
(八)keycloak 设置客户端访问类型 confidential
(九)keycloak使用nginx来配置https
文章目录
前言
keycloak配置https有两种方式:
- 直接在keycloak.conf中配置
- 使用代理服务器配置,如nginx
因为还要同时配置其他应用服务,我们直接使用了nginx代理配置https,同时保留http访问
1.生成https需要的ssl证书
ssl证书生成也有很多种方式,可以直接免费的ssl商来生成,也可以自定义生成。
本篇教程主要使用openssl工具来生成自定义的证书
1.1 生成服务器端私钥
openssl genrsa -out /opt/server.key 2048
1.2 生成服务器端公钥
openssl rsa -in /opt/server.key -pubout -out /opt/server.pem
1.3 生成CA证书
openssl genrsa -out /opt/ca.key 2048
openssl req -new -key /opt/ca.key -out /opt/ca.csr
这个命令执行的时候注意下:
Common Name 这一项请填写你的域名
openssl x509 -req -in /opt/ca.csr -signkey /opt/ca.key -out /opt/ca.crt -days 3650
1.4 生成服务器证书
openssl req -new -key /opt/server.key -out /opt/server.csr
同样要注意 Common Name 这一项请填写你的域名
颁发证书
openssl x509 -req -CA /opt/ca.crt -CAkey /opt/ca.key -CAcreateserial -in /opt/server.csr -out /opt/server.crt -days 3650
1.5 生成cer文件
openssl x509 -in /opt/server.crt -out /opt/server.cer -outform der -days 3650
2.配置nginx
将生成的 servert.crt server.key 这两个文件配置到nginx中,我是直接将这两个文件复制到了nginx的配置文件目录,配置如下:
server {
listen 8080;
listen 443 ssl;
server_name localhost,192.168.100.10;
# 证书路径
ssl_certificate csr.pem;
ssl_certificate_key csr-key.pem;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
# 以下配置为公共配置
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
# 页面引用的文件转到https的关键配置
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http:// $scheme://;
# keycloak的代理地址,只代理 http
location / {
proxy_pass http://192.168.100.1:8080;
}
location /demo{
proxy_pass http://192.168.100.2:8080/demo;
}
3.配置keycloak (此步骤非必须)
nginx配置完成后,需要在keycloak的conf配置文件中修改下配置
# nginx-https代理配置
# 代理模式 edge 或 passthrough
proxy=edge
hostname-strict=false
hostname-strict-https=false
spi-sticky-session-encoder-infinispan-should-attach-route=false
#https的端口,这个可以不用配置,因为我们没有用到
都配置完成后,重启nginx,重启keycloak,重启你的应用程序,这时候就可以同时使用http和https来访问你的项目了
4.常见问题
4.1 如果使用springboot的jar方式启动,需要配置下反向代理
server:
# 如果nginx配置了https,springboot没有配置,需要在这里开启,否则无法跳转
forward-headers-strategy: framework
或者
server:
tomcat:
remoteip:
remote-ip-header: X-Forwarded-For
protocol-header: X-Forwarded-Proto
port-header: X-Forwarded-Port
这些配置对应到tomcat中(如果使用war包打包)conf\server.xml < host > 下
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpHeader="X-Forwarded-For"
portHeader="X-Forwarded-Port"
protocolHeader="X-Forwarded-Proto"/>
4.2 如果tomcat或者java应用报错:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: :
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested targe
报错原因是java不能信任这个证书导致的,解决方法有多种,这里只介绍将证书导入到jre中这一种。
4.2.1 首先将你证书 (证书可以直接从浏览器上导出) 格式选Base64编码
4.2.2 执行命令
keytool -importcert -alias 你保存证书的别名(任意值) -keystore /opt/jdk1.8.0_192/jre/lib/security/cacerts -file /opt/jdk1.8.0_192/jre/lib/security/server.cert
第一个路径为jre路径,第二个路径为你证书存放的路径
JDK默认证书的密码是 changeit
提示是否信任后输入Y
4.3 放到服务器上后使用外网IP访问http服务,出现需要ssl
并在代码中将 keycloak的
ssl-required设置为none