CAS server6.x配置与部署笔记

    技术2023-06-17  72

    由于最近将公司的springboot升级到了springboot2,而5.x的cas-server使用的是springboot1,因此为了更方便的开发cas-server,将cas-server升级为6.x,6.x使用的是springboot2。6.x版本cas-server的配置与5.x版本大致上一致,网上大部分文档都是基于5.x版本的介绍,这次部署了6.2版本的cas-server,有些不同的地方以及踩过的坑在这里记录一下,方便以后回顾。

    cas-overlay-template:https://github.com/apereo/cas-overlay-template/tree/6.2

    1.  6.x使用的是jdk11,5.x使用的是jdk8。

    下载openjdk11,openjdk11也可被建议在生产环境上使用(主要还是oraclejdk用在线上业务收费了哈哈)。与jdk8之间有很多不同,丢了很多api,javaEE相关包也不再默认自带(感叹时光催人老,javaEE的一些老规范和api因为各种新技术的出现和流行被弱化了),默认gc也变成了g1。总之两者很多不同,不延伸了。

    2. 6.x使用gradle代替之前的maven。

    如果直接使用项目中自带的gradle脚本,gradlew或gradlew.bat打包管理,要确保系统中的JAVA_HOME或是java command已调整到jdk11,并且使用项目自带的gradle-wrapper,不需要再另行下载gradle。具体定位使用的java command参考gradlew中的脚本片段:

    # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables JAVACMD="$JAVA_HOME/jre/sh/java" else JAVACMD="$JAVA_HOME/bin/java" fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else JAVACMD="java" which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi

    若是使用idea或其他编辑器自带的gradle插件打包,则需修改gradle使用的jvm,如idea下:

    3. 资源配置重写

    5.x打包后在WEB-INF/classes下可找到如application.properties等资源配置文件。但在6.x后,这些配置资源被移到了WEB-INF/lib/cas-server-webapp-resources-*.jar。可以直接参考,并在src/main/resources下定义自己的配置资源。

    4. SSL证书

    本地测试时如需要使用SSL证书,可使用keytool创建自签证书,或直接使用./gradlew createKeystore,不过使用该task创建keystore时,默认使用的域名是cas.example.org,要修改本地hosts后再访问。该task的代码片段:

    task createKeystore(group: "CAS", description: "Create CAS keystore") { doFirst { mkdir "/etc/cas" def keystorePath = "/etc/cas/thekeystore" def dn = "CN=cas.example.org,OU=Example,OU=Org,C=US" if (project.hasProperty("certificateDn")) { dn = project.getProperty("certificateDn") } def subjectAltName = "dns:example.org,dns:localhost,ip:127.0.0.1" if (project.hasProperty("certificateSubAltName")) { subjectAltName = project.getProperty("certificateSubAltName") } // this will fail if thekeystore exists and has cert with cas alias already (so delete if you want to recreate) logger.info "Generating keystore for CAS with DN ${dn}" exec { workingDir "." commandLine "keytool", "-genkeypair", "-alias", "cas", "-keyalg", "RSA", "-keypass", "changeit", "-storepass", "changeit", "-keystore", keystorePath, "-dname", dn, "-ext", "SAN=${subjectAltName}" } logger.info "Exporting cert from keystore..." exec { workingDir "." commandLine "keytool", "-exportcert", "-alias", "cas", "-storepass", "changeit", "-keystore", keystorePath, "-file", "/etc/cas/cas.cer" } logger.info "Import /etc/cas/cas.cer into your Java truststore (JAVA_HOME/lib/security/cacerts)" } }

    自建完的keystore放在/etc/cas,需要将该keystore加入到java可信任证书。jdk11和jdk8不同,没有jre目录,cacerts一般位于$JAVA_HOME/lib/security/cacerts。

    keytool -import -keystore "$JAVA_HOME/lib/security/cacerts" -file /etc/cas/cas.cer -alias cas

    默认密码:changeit。

    测试完后若需要删除证书:

    keytool -delete -alias cas -keystore "$JAVA_HOME/lib/security/cacerts"

    部署生产环境时,使用的证书一般都是可信任机构颁发的,无需再加到java cacerts。只需将配置中指定的ssl证书改成指向生产的证书。不过我们还需要将pem格式的证书和密钥转换成keystore可处理的格式,如PKCS12。参考:https://www.sslaaa.com/help/apache-pem-key-and-certificat-to-tomcat,这里是导到tomcat,不过转换格式的原理一样。转换完后修改src/main/resources/application.properties或者etc/cas/config/cas.properites(如果改的这个cas.properties别忘了执行./gradlew copyCasConfiguration)

    server.ssl.key-store=file:/etc/cas/{你刚转好的PKCS12证书} server.ssl.key-store-password=*** server.ssl.key-password=*** cas.server.name={你的域名证书对应的域名}

    执行./gradlew run启动:

    这里也能看到使用的java home。

    访问cas.server.name配置的域名:

    Processed: 0.020, SQL: 9