关于批量提取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. 脚本为何能忽略证书间的多空格或无空格仍正常工作?
原因主要有两点:
- 触发逻辑精准:脚本仅在读取到包含
END的行时才会调用openssl解析证书,证书间的空白行不会触发解析操作,只会被暂时拼入txt变量; - openssl兼容性强:
openssl x509命令只会识别-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----包裹的有效证书内容,外部的空白行、无关字符会被自动忽略,不会影响解析结果。
因此无论证书之间是单个空白行还是多个空白行,都不会干扰脚本的正常运行。
内容的提问来源于stack exchange,提问作者trustbyte
相关产品推荐
相关产品推荐

