You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于批量提取PEM证书过期日期脚本的技术疑问

批量解析多PEM证书过期日期的脚本原理拆解

之前我通过API获取了一个打包了多份PEM证书的文件,内容示例如下:

-----BEGIN CERTIFICATE-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAA
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
BBB
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAssssssssssssssssssssssssssssssssssssssssssssss
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdddddd
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAssss
-----END CERTIFICATE-----

参考社区用户的思路后,我实现了一份可以提取每份证书过期日期的脚本,运行正常:

while read line
do
if [ "${line//END}" != "$line" ]; then
txt="$txt$line\n"
printf -- "$txt" | openssl x509 -enddate -noout | cut -d "=" -f 2
txt=""
else
txt="$txt$line\n"
fi
done < /path/to/bundle/file

不过我想彻底搞懂这个脚本的逻辑以便复用,所以整理了几个疑问并逐一拆解:

疑问解答

1. 表达式${line//END}的作用是什么?//在字符串处理中的含义是什么,是否用于检测line变量包含END?

这是Bash内置的全局字符串替换语法:${变量//匹配字符串/替换字符串},这里替换字符串留空,意味着会把line变量中所有的END子串替换成空字符。

而判断"${line//END}" != "$line"的逻辑很直接:如果替换后的字符串和原字符串不相等,说明原line中一定包含END——也就是我们要识别的证书结束行-----END CERTIFICATE-----。本质上这就是一种简洁的“检测当前行是否为证书结尾”的方式。

2. 脚本中为何需要else分支的txt="$txt$line\n"语句?

这个脚本的核心逻辑是逐行拼接完整证书内容:

  • 当未遇到包含END的行时(比如证书的起始行、正文内容行,甚至证书间的空白行),会把当前行加上换行符拼入txt变量,逐步攒出完整的单份证书内容;
  • 只有当遇到证书结束行时,才会把这最后一行也拼入txt,接着通过printf输出完整证书内容,传给openssl x509命令解析过期日期,最后清空txt变量,准备接收下一份证书的内容。

如果去掉else分支,那么除了结束行之外的所有行都不会被拼入txt,openssl拿到的是残缺的内容,自然无法正常解析证书信息。

3. 脚本为何能忽略证书间的多空格或无空格仍正常工作?

原因主要有两点:

  1. 触发逻辑精准:脚本仅在读取到包含END的行时才会调用openssl解析证书,证书间的空白行不会触发解析操作,只会被暂时拼入txt变量;
  2. openssl兼容性强:openssl x509命令只会识别-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----包裹的有效证书内容,外部的空白行、无关字符会被自动忽略,不会影响解析结果。

因此无论证书之间是单个空白行还是多个空白行,都不会干扰脚本的正常运行。

内容的提问来源于stack exchange,提问作者trustbyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:47:49