环境
Windows 10
keycloak 10.0.1
openssl 1.1.0i 14 Aug 2018
jdk 8.0
standalone模式
IE 浏览器
上面这些只是说明本文的测试环境,可自行搭配,问题不大
准备证书及密钥库
建议整个创建过程在一个空的文件中进行,创建完所有需要的证书再拿出去使用
tip: 先创建一个server.ext文件到文件夹中,所有的密码都设置为changeit,防止忘记
- server.ext
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
subjectAltName = @alt_names
[alt_names]
DNS.1 = server
- 创建根证书 rootCA
openssl req -x509 -sha256 -days 3650 -newkey rsa:4096 -keyout rootCA.key -out rootCA.crt
- 将根证书放入truststore.jks 密钥库中
keytool -import -keystore truststore.jks -file rootCA.crt -alias root
- 创建服务器证书
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes
- 使用根证书对服务器证书进行签署
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in server.csr -out server.crt -days 365 -CAcreateserial -extfile server.ext
- 将server.key和server.crt合并放入一个keystore中
openssl pkcs12 -export -out server.jks -name "server" -inkey server.key -in server.crt
- 创建一个用户证书alice
openssl req -new -newkey rsa:4096 -nodes -keyout alice.key -out alice.csr
记住 Common Name 和 Email Address两个信息
- 使用rootCA对alice证书进行签署
openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in alice.csr -out alice.crt -days 365 -CAcreateserial
- 将alice.key和alice.crt合并存入一个keystore中
openssl pkcs12 -export -out alice.p12 -name "alice" -inkey alice.key -in alice.crt
所有操作完毕后文件夹中的所有文件
https通道的建立
为保证安全性,证书需要在安全的通道上去传输,所以在使用证书登录之前,需要建立安全的访问通道,https
启动standalone服务器
F:\zhibe\keycloak-LoginWithCert\keycloak-10.0.1\bin>standalone
访问 http://localhost:8080/auth 并登录
项目启动正常
接着访问 https://localhost:8443/auth
开始配置
- 将rootCA证书导入浏览器
- 将server.jks导入standalone服务器
- 到\standalone\configuration目录下修改standalone.properties及standalone-ha.properties文件
<security-realms>
...
<security-realm name="ssl-realm">
<server-identities>
<ssl>
<keystore path="server.jks"
relative-to="jboss.server.config.dir"
keystore-password="changit"/>
</ssl>
</server-identities>
...
</security-realm>
...
</security-realms>
....
<server name="default-server">
...
<!-- <https-listener name="https" socket-binding="https" security-realm="ApplicationRealm" enable-http2="true"/> -->
<https-listener name="https" socket-binding="https" security-realm="ssl-realm" verify-client="REQUESTED" enable-http2="true"/>
<host name="default-host" alias="localhost">
....
<!--<http-invoker security-realm="ApplicationRealm"/>-->
<http-invoker security-realm="ssl-realm"/>
</host>
</server>
.....
- 将server.jks放到\standalone\configuration目录下
- 重启服务器
F:\zhibe\keycloak-LoginWithCert\keycloak-10.0.1\bin>standalone
访问 http://localhost:8080/auth 并登录
启动正常
接着访问 https://localhost:8443/auth 并登录
点击右上方的锁logo,查看证书信息
登录正常
https通道建立成功
证书登录
- keycloak服务器设置
- 创建一个realm
- 创建一个flow
删除没必要的认证类型后
点击Add execution选择X509/Validate Username Form
- 创建一个realm
将X509/Validate Username Form 往上移动一格,点选 ALTERNATIVE
点击action点进config
点击保存
点击Bindings菜单
修改Browser Flow 的选择
点击保存
3. 创建一个用户
点击保存
- 将truststore.jks导入服务器
- 到\standalone\configuration目录下修改standalone.properties及standalone-ha.properties文件
<security-realm name="ssl-realm">
...
<authentication>
<truststore path="truststore.jks"
relative-to="jboss.server.config.dir"
keystore-password="changeit"/>
</authentication>
</security-realm>
- 将truststore.jks放到\standalone\configuration目录下
- 将alice.p12导入浏览器
- 重启服务器
F:\zhibe\keycloak-LoginWithCert\keycloak-10.0.1\bin>standalone
访问 http://localhost:8080/auth 并登录
启动正常
接着访问 https://localhost:8443/auth 并登录
点击右上方的锁logo,查看证书信息
登录正常
到x509realm中在clients菜单中点击https://localhost:8443/auth/realms/x509/account/
证书登入成功
参考资料:
配置keycloak支持x509证书登入:https://www.keycloak.org/docs/latest/server_admin/#_x509
docker-compose版本的配置视频:https://www.youtube.com/watch?v=yq1hzNs1JQU
openssl生成自签名证书指令及过程:https://gist.github.com/dasniko/b1aa115fd9078372b03c7a9f7e9ec189
感谢
Niko Köbler 给我的指引
thank you!