CAS server6.x配置與部署筆記

由於最近將公司的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配置的域名:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章