近几日,接收到了域名证书到期提醒。之前是15天的WARNing警告信息,这几天是7天内的Critical信息。虽然还有3天就上班了。但是手痒痒,总想升级了,了一庄事儿。

按照升级文档升级后,有个客户说下午6点后开始出现错误,且是多次错误。领导联系了我,我说先恢复之前的证书吧。后来用户说也是可以了。

事后,开始排查原因。通过myssl网站对域名进行证书检查,没想到还真有发现。

  • 之前的证书状态居然是不可信
    2024-02-16T14:23:32.png
    2024-02-16T14:23:46.png
  • 之前的证书的根证书颁发机构与新证书不一样。难道是这个原因?

2024-02-16T14:24:25.png
2024-02-16T14:24:42.png

一、补救措施

1.1 花钱买证书

1.2 升级JAVA客户端根证书记录

通过网址https://letsencrypt.org/certificates/ 下载https://letsencrypt.org/certs/isrg-root-ocsp-x1.pem

2024-02-16T14:26:20.png

  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

三、相关脚本

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

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
最后修改:2024 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏