Apereo CAS 之 在本地运行
Apereo CAS,是 CAS 协议official reference implementation
,也差不多是当前开源的 SSO 解决方案最好、最成熟的一个了。
当前版本是 6.5,https://github.com/apereo/cas-overlay-template/tree/6.5。
本以为按照Apereo CAS 的官方安装指南能够很容易把 cas server 在本地跑起来,但最后发现这个文档实操性略差。这里略过基础概念,直接记录一下本地运行的步骤。
没必要下载源码修改代码、配置然后 build 出自己的安装包,按照官方文档推荐直接使用“WAR Overlay Installation”的方式安装。
1)下载 overlay 框架代码,使用 6.5 分支代码。
git clone https://github.com/apereo/cas-overlay-template.git cas-server
git checkout -b 6.5 origin/6.5
Overlays 这个方式是通过 maven-war-plugin 实现的: https://maven.apache.org/plugins/maven-war-plugin/overlays.html,
gradle 的实现:https://docs.freefair.io/gradle-plugins/current/reference/#_io_freefair_war_overlay
在这个 cas 项目里可参看 ./gradle/springboot.gradle 里 bootWar 部分。
2)gradle.perperties
这利用这个 overlays 项目运行 CAS 之前,可浏览一下 gradle.properties 文件定义的各个属性。其中,
appServer 用于定义 Apereo CAS server 使用哪个内置 server(Tomcat、Jetty…),如果只生成 war 部署到外部已存在的 servlet contaier 则无需定义此项。
certDir、serverKeyStore、exportedServerCert、storeType 这些选项用于定义 https 所用的证书。
3)gradle/tasks.gradle
./gradlew tasks
运行会显示可执行的 tasks,其中一部分 task 被定义于 gradle/tasks.gradle 文件中。
CAS tasks
---------
casVersion - Display the current CAS version
copyCasConfiguration - Copy the CAS configuration from this project to /etc/cas/config
createKeystore - Create CAS keystore
createTheme - Create theme directory structure in the overlay
... ...
其中 createKeystore 用于生成 https 所用的证书。sudo ./gradlew createKeystore
如果需要修改 keystore 的密码,可以执行:keytool -storepasswd -keystore /etc/cas/thekeystore
生成 https 需要的 PK 和证书后,需要把 CA 导入到 JDK 的的 ca 根证书库中。
cd /etc/cas
sudo keytool -import -alias cas_cert -storepass changeit -file cas.crt -keystore /Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home/lib/security/cacerts
查看 ca keystoresudo keytools -list -storepass changeit -keystore /Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home/lib/security/cacerts
从 ca keystore 中删除 cascertsudo keytool -delete -alias cas_cert -keystore /Library/Java/JavaVirtualMachines/temurin-11.jdk/Contents/Home/lib/security/cacerts -storepass changeit
4)cas 的配置文件
把项目中的 etc/cas/config 目录下的默认配置内容 copy 到 /etc/cas/config 中。可以手工 copy 文件,也可以通过 gradle task, ./gradlew copyCasConfiguration
默认的内置的用户名密码是 casuser/Mellon,可以通过修改/etc/cas/config/cas.properties cas.authn.accept.users=casuser::password
进行定义。
配置登录用户在 Apereo 里属于CAS Authentication 的范畴。
5)Build and Run
./gradlew clean build
java -jar ./build/libs/cas.war
在浏览器中访问 https://localhost:8443/cas 进入 CAS 系统。
6)
如果在日志里发现提示The generated key MUST be added to CAS settings
, 则可按照提示把 cas.tgc.crypto.encryption.key,cas.tgc.crypto.signing.key 加入到 etc/cas/config/cas.properties 文件。
2022-08-29 23:29:34,160 WARN [org.apereo.cas.util.cipher.BaseStringCipherExecutor] - <Secret key for encryption is not defined for [Ticket-granting Cookie]; CAS will attempt to auto-generate the encryption key>
2022-08-29 23:29:34,168 WARN [org.apereo.cas.util.cipher.BaseStringCipherExecutor] - <Generated encryption key [rAHG_XeYnE-DbLtE77fngWAMtbB5lpIXYKbI_nSiD8I] of size [256] for [Ticket-granting Cookie]. The generated key MUST be added to CAS settings:
cas.tgc.crypto.encryption.key=rAHG_XeYnE-DbLtE77fngWAMtbB5lpIXYKbI_nSiD8I
>
2022-08-29 23:29:34,170 WARN [org.apereo.cas.util.cipher.BaseStringCipherExecutor] - <Secret key for signing is not defined for [Ticket-granting Cookie]. CAS will attempt to auto-generate the signing key>
2022-08-29 23:29:34,170 WARN [org.apereo.cas.util.cipher.BaseStringCipherExecutor] - <Generated signing key [cOlc7xQB5UJTwYrVmA30aQehEkxbSkcyHmE8vRkPHboRZkTn2rBJ8pUUPZfTJt7H8e3ecpitvuH2prrLxfIVxg] of size [512] for [Ticket-granting Cookie]. The generated key MUST be added to CAS settings:
cas.tgc.crypto.signing.key=cOlc7xQB5UJTwYrVmA30aQehEkxbSkcyHmE8vRkPHboRZkTn2rBJ8pUUPZfTJt7H8e3ecpitvuH2prrLxfIVxg
Reference:
[1]: https://apereo.github.io/cas/6.5.x/index.html
[2]: https://github.com/apereo/cas-overlay-template/tree/6.5
[3]: https://medium.com/swlh/install-cas-server-with-db-authentication-8ff52234f52