Loading... 近几日,接收到了域名证书到期提醒。之前是15天的WARNing警告信息,这几天是7天内的Critical信息。虽然还有3天就上班了。但是手痒痒,总想升级了,了一庄事儿。 按照升级文档升级后,有个客户说下午6点后开始出现错误,且是多次错误。领导联系了我,我说先恢复之前的证书吧。后来用户说也是可以了。 事后,开始排查原因。通过myssl网站对域名进行证书检查,没想到还真有发现。 * 之前的证书状态居然是不可信 ![2024-02-16T14:23:32.png][1] ![2024-02-16T14:23:46.png][2] * 之前的证书的根证书颁发机构与新证书不一样。难道是这个原因? ![2024-02-16T14:24:25.png][3] ![2024-02-16T14:24:42.png][4] # 一、补救措施 ## 1.1 花钱买证书 ## 1.2 升级JAVA客户端根证书记录 通过网址https://letsencrypt.org/certificates/ 下载https://letsencrypt.org/certs/isrg-root-ocsp-x1.pem ![2024-02-16T14:26:20.png][5] 1. 获取根证书 首先,你需要获得要添加的根证书的.crt文件。这通常可以从证书颁发机构(CA)的官方网站下载。例如,如果你需要更新ISRG Root X1证书,你可以从Let's Encrypt的网站获取该证书的最新版本。 2. 定位Java信任存储 Java的cacerts文件通常位于$JAVA_HOME/lib/security目录下(对于较新版本的Java,可能位于$JAVA_HOME/lib/security或$JAVA_HOME/jre/lib/security),这里的$JAVA_HOME是你的Java安装目录。 3. 将根证书添加到信任存储 使用keytool命令,这是Java开发工具包(JDK)提供的一个工具,用于管理密钥和证书。你需要使用-import选项将新的根证书添加到cacerts信任存储中。以下是一个示例命令: ``` keytool -import -trustcacerts -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit -noprompt -alias isrgrootx1 -file path/to/isrgrootx1.crt ``` 这里的参数说明如下: -import: 命令选项,用于将证书或公钥导入到keystore。 -trustcacerts: 选项,表示信任证书颁发机构的证书。 -keystore: 指定cacerts文件的路径。 -storepass: cacerts的密码,默认是changeit。 -noprompt: 导入过程中不提示确认信息。 -alias: 为导入的证书设置一个别名,例如isrgrootx1。 -file: 指向你下载的根证书文件的路径。 注意事项 备份cacerts文件:在做任何更改之前,强烈建议备份原有的cacerts文件,以防万一需要恢复。 更新Java版本:如果你的Java版本太旧,可能不包括最新的安全修复和根证书更新。定期更新Java版本可以帮助确保你的应用程序安全且当前。 权限:执行上述keytool命令可能需要管理员权限,特别是在修改位于系统目录中的cacerts文件时。 在SSL/TLS证书的世界里,.pem和.crt文件扩展名通常用于指代证书文件,但它们之间的主要区别通常是格式和编码方式,而不是文件内容本身。大多数情况下,.pem文件和.crt文件都可以包含相同的证书信息,它们都是基于文本的,并且使用Base64编码。.pem文件格式是一种更为通用的格式,它可以包含证书链、私钥或者其他证书相关信息,而.crt文件通常只包含单个证书。 # 二、汇总 对方是java程序,大概率需要更新本地jdk的证书 找到当前cacerts文件,看看里面是否有“ISRG Root X1” 对于操作系统,可以通过 trust list | grep -i "ISRG Root X1" 或者 grep -R "ISRG Root X1" /etc/ssl/certs 以及,通过如下命令更新“系统证书存储” ``` sudo apt-get update && sudo apt-get install ca-certificates sudo yum update && sudo yum install ca-certificates sudo pacman -Syu ca-certificates ``` ``` keytool -list -keystore /usr/java/jdk1.8.0_144/jre/lib/security/cacerts -storepass changeit | grep "ISRG Root X1" ``` ``` keytool -list -keystore /usr/java/jdk1.8.0_144/jre/lib/security/cacerts -storepass changeit | grep "DST Root CA X3" ``` ``` keytool -list -keystore /usr/java/jdk1.8.0_144/jre/lib/security/cacerts -storepass changeit | grep -i digicert ``` ![2024-02-16T14:40:23.png][6] # 三、相关脚本 ## 3.1 获取jdk中的cacert文件内容 ``` #!/bin/bash # 设置Java的cacerts文件的路径 CACERTS_PATH="/usr/java/jdk1.8.0_144/jre/lib/security/cacerts" # 默认的cacerts密码 STOREPASS="changeit" keytool -list -v -keystore $CACERTS_PATH -storepass $STOREPASS | awk '/Alias name:/ {alias=$3} /Valid from:/ {print "Certificate: " alias ", " $0; alias=""}' ``` ![2024-02-17T07:31:33.png][7] ## 3.2 获取linux系统中的证书 ``` #!/bin/bash # 指定ca-bundle.crt文件的路径 CA_BUNDLE_PATH="/etc/ssl/certs/ca-bundle.crt" # 检查文件是否存在 if [ ! -f "$CA_BUNDLE_PATH" ]; then echo "文件 $CA_BUNDLE_PATH 不存在。" exit 1 fi echo "正在检查文件 $CA_BUNDLE_PATH 中的证书..." # 分割ca-bundle.crt文件中的证书,并逐一处理 csplit -sz "$CA_BUNDLE_PATH" '/-----BEGIN CERTIFICATE-----/' '{*}' > /dev/null # 遍历生成的xx00,xx01,...文件 for CERT_FILE in xx*; do # 获取证书的主题名称 SUBJECT_NAME=$(openssl x509 -in "$CERT_FILE" -noout -subject | sed -e 's/subject= //;s/.*CN=//') # 获取证书的有效期 EXPIRY_DATE=$(openssl x509 -in "$CERT_FILE" -noout -enddate | cut -d= -f2) if [ ! -z "$SUBJECT_NAME" ] && [ ! -z "$EXPIRY_DATE" ]; then echo "Certificate: $SUBJECT_NAME, Expiry Date: $EXPIRY_DATE" fi # 清理生成的临时证书文件 rm "$CERT_FILE" done ``` ## 3.3 检查站点的证书链 ``` #!/bin/bash # 检查参数 if [ "$#" -ne 1 ]; then echo "使用方法: $0 <域名>" exit 1 fi DOMAIN=$1 # 使用openssl s_client获取证书链,并使用awk分割证书到单独的文件 echo | openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} -showcerts 2>/dev/null | awk ' BEGIN {c=0;} /-----BEGIN CERTIFICATE-----/ {p=1;} p {print > "cert" c ".pem";} /-----END CERTIFICATE-----/ {p=0; c++;}' # 循环遍历证书文件,并打印所需信息 count=0 while [ -s "cert${count}.pem" ]; do echo "证书 #$((count+1)):" openssl x509 -in "cert${count}.pem" -noout -subject -issuer -dates echo "" ((count++)) done # 清理生成的证书文件 rm cert*.pem ``` [1]: https://www.sddts.cn/usr/uploads/2024/02/104055034.png [2]: https://www.sddts.cn/usr/uploads/2024/02/1545918546.png [3]: https://www.sddts.cn/usr/uploads/2024/02/2515155837.png [4]: https://www.sddts.cn/usr/uploads/2024/02/155298879.png [5]: https://www.sddts.cn/usr/uploads/2024/02/2621915953.png [6]: https://www.sddts.cn/usr/uploads/2024/02/3965604020.png [7]: https://www.sddts.cn/usr/uploads/2024/02/2192743569.png 最后修改:2024 年 05 月 11 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏