Docker 部署 ApereoCAS 过程记录(采坑集锦)

文章讲述了在使用Docker部署CAS服务时遇到的报错,问题在于缺少秘钥文件thekeystore。通过分析错误日志,确定了问题原因并介绍了如何使用keytool生成匹配CAS服务JDK环境的密钥文件,以及如何将密钥文件复制到容器中,最终解决服务启动问题。
摘要由CSDN通过智能技术生成

一、获取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.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
    at java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
    at org.apache.catalina.startup.CatalinaBaseConfigurationSource.getResource(CatalinaBaseConfigurationSource.java:121)
    at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:197)
    at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207)
    at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:282)
    at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:246)
    at org.apache.tomcat.util.net.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 format
    at 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.net.SSLUtilBase.getStore(SSLUtilBase.java:216)
    at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207)
    at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:282)
    at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:246)
    at org.apache.tomcat.util.net.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.com,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的图案~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值