集锦)"/>
Docker 部署 ApereoCAS 过程记录(采坑集锦)
一、获取docker镜像(以下所有命令都以本人部署服务时使用的为例)
docker pull apereo/cas
获取最新镜像,如果你有指定的版本,后面加上冒号版本号即可
二、初步运行服务
docker run -d --name cas -p 8443:8443 -v /mydata/cas/config/cas.properties:/etc/cas/config/cas.properties -p 8878:8080 apereo/cas
cas服务的配置文件在 /etc/cas/config/cas.properties ,此处将配置文件挂载到本地
的/mydata/cas/config/cas.properties 然后两个端口映射(8878我暂时没搞懂是干啥使的)
三、坐等服务运行报错
如果想看看报错信息,可以在执行完run命令后,执行下面的命令(cas是容器名,记得更换为自己的名字),来跟踪日志输出
docker attach cas
紧接着你刚开始看到的还算正常,紧接着,很炒蛋的stop!就出现了,这个沙比stop!我看了两天,关键报错信息如下:
Caused by: java.io.FileNotFoundException: /etc/cas/thekeystore (No such file or directory)at java.base/java.io.FileInputStream.open0(Native Method)at java.base/java.io.FileInputStream.open(Unknown Source)at java.base/java.io.FileInputStream.<init>(Unknown Source)at java.base/java.io.FileInputStream.<init>(Unknown Source)at java.base/sun.www.protocol.file.FileURLConnection.connect(Unknown Source)at java.base/sun.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)at org.apache.catalina.startup.CatalinaBaseConfigurationSource.getResource(CatalinaBaseConfigurationSource.java:121)at org.apache.tomcat.util.SSLUtilBase.getStore(SSLUtilBase.java:197)at org.apache.tomcat.util.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207)at org.apache.tomcat.util.SSLUtilBase.getKeyManagers(SSLUtilBase.java:282)at org.apache.tomcat.util.SSLUtilBase.createSSLContext(SSLUtilBase.java:246)at org.apache.tomcat.util.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97)
观察一下报错信息,我们不难发现,是缺少了某个文件导致的, 而这个文件,是秘钥文件,cas启动的时候会自动去/etc/cas/路径下找名为thekeystore(秘钥存储)的文件,找不到就报错了。知道错误原因,那我们下一步自然就是生成这个采坑无数的沙比文件
四、使用java提供的keytool命令生成秘钥文件
首先,在生成以前,需要注意一点,那就是这个秘钥文件要求特别严格,你需要先确定你的cas服务的jdk环境是多少,这个信息可以在每次run你的docker服务的log中看到,如下:
_ ____ _____ ____ _____ ___ ____ _ ____ / \ | _ \| ____| _ \| ____/ _ \ / ___| / \ / ___| / _ \ | |_) | _| | |_) | _|| | | | | | / _ \ \___ \ / ___ \| __/| |___| _ <| |__| |_| | | |___ / ___ \ ___) |/_/ \_\_| |_____|_| \_\_____\___/ \____/_/ \_\____/ CAS Version: 6.4.0-RC1
CAS Branch: master
CAS Commit Id: a523ec42dc94497c91ef25ebd4c20f6d7b64fdba
CAS Build Date/Time: 2021-01-30T06:20:56Z
Spring Boot Version: 2.4.2
Spring Version: 5.3.3
Java Home: /opt/java/openjdk
Java Vendor: AdoptOpenJDK
Java Version: 11.0.10
JVM Free Memory: 132 MB
JVM Maximum Memory: 1 GB
JVM Total Memory: 262 MB
OS Architecture: amd64
OS Name: Linux
OS Version: 3.10.0-1160.76.1.el7.x86_64
OS Date/Time: 2023-03-12T15:02:01.641822
OS Temp Directory: /tmp
------------------------------------------------------------
Apache Tomcat Version: Apache Tomcat/9.0.41
------------------------------------------------------------
这是我启动时候看到的信息,可以看到java version 这一栏是11.0.10
得知cas的jdk环境后,你生成密钥文件所使用的jdk环境,需要与cas的一致,否则就会出现生成密钥文件后,拷贝到容器中,启动报错说秘钥文件格式不正确的错误,我百度了半天,才知道是因为jdk版本不对应。下面是报错信息
Caused by: java.io.IOException: Invalid keystore formatat java.base/sun.security.provider.JavaKeyStore.engineLoad(Unknown Source)at java.base/sun.security.util.KeyStoreDelegator.engineLoad(Unknown Source)at java.base/java.security.KeyStore.load(Unknown Source)at org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:69)at org.apache.tomcat.util.SSLUtilBase.getStore(SSLUtilBase.java:216)at org.apache.tomcat.util.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207)at org.apache.tomcat.util.SSLUtilBase.getKeyManagers(SSLUtilBase.java:282)at org.apache.tomcat.util.SSLUtilBase.createSSLContext(SSLUtilBase.java:246)at org.apache.tomcat.util.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97)
所以需要先安装好jdk11.0.10(以我的为例),安装好后,执行下面的生成密钥的命令
keytool -genkey -alias youhoucas -keyalg RSA -validity 3650 -keystore ./thekeystore -keypass changeit -storepass changeit -dname "CN=cas.youhou,OU=youhou,O=youhou,L=TianJin,ST=TianJin,C=CN"
这里简单说明一下各个参数是什么作用,详细信息可自行百度
-genkey 生成密钥对
-alias 密钥条目别名
-keyalg 密钥算法
-validity 密钥有效时间
-keystore 密钥文件位置
-keypass 修改密钥条目的密码
-storepass 修改秘钥库的存储密码
-dname 指定证书拥有者信息
其中,最关键的就是keypass以及storepass这两个密码,开始我想用自定义的密码,但是cas服务默认会使用changeit作为密码(两个都是changeit),这就会导致用自己自定义的密码,就会导致cas无法使用此秘钥文件,因为它只会用煞笔changeit作为密码,我想改它的配置文件去修改这个默认值,它没有一个能用的密钥文件,服务都无法启动,导致最后我只能妥协,所以切记,密码开始最好使用changeit。
生成好密钥文件以后,我们需要重启cas服务,并在它再次报错关闭之前,执行docker cp命令,将刚刚生成的密钥文件拷贝到cas容器的/etc/cas/目录下,可以使用如下命令
docker restart cas && docker cp ./thekeystore cas:/etc/cas/thekeystore
拷贝好后,再次重启cas服务,即可看到Ready的图案~
更多推荐
Docker 部署 ApereoCAS 过程记录(采坑集锦)
发布评论