在我的工作中,我们使用内部CA,它运行在Windows服务器上。当我想在Linux机器上使用它的CRL时,我必须执行以下步骤:
CRL.pem)为此,我编写了下面的小脚本,每天由计时器单元(在没有cron的系统上自动运行)运行一次。
#!/usr/bin/env bash
crls=(RootCA IntermediateCA IntermediateCA2)
new_crl="newcrl.pem"
crl_temp=$(mktemp -q -d /tmp/pullcrl.XXXXX)
crl_dir="/etc/pki/tls/misc"
for crl in ${crls[@]}; do
if curl -s http://url_of_crls/${crl}.crl -o ${crl_temp}/${crl}.crl; then
openssl crl -in ${crl_temp}/${crl}.crl -inform DER -out ${crl_temp}/${crl}.pem
else
echo "Download a crl file failed!"
exit 1
fi
done
cat ${crl_temp}/*.pem > ${crl_temp}/${new_crl}
mv ${crl_temp}/${new_crl} ${crl_dir}/${new_crl}我能做点更好的事吗?
发布于 2019-09-16 16:45:53
${crls}中的crl;
总是引用数组扩展是一个好习惯。
在成功运行之后清理临时目录将是一个很好的操作(或者完全取消它;请参见下面)。
cat ${crl_temp}/*.pem > ${crl_temp}/${new_crl} mv ${crl_temp}/${new_crl} ${crl_dir}/${new_crl}
我猜你这么做是为了得到原子替换?只有当/tmp和/etc在同一个文件系统上时,它才能工作。如果它们不是,则可以在(例如)目标已满时获得一个空的目标文件。考虑在/etc下创建一个工作目录是确定的。
使用cd和brace展开以及bash自己的错误处理(通过set -euxo pipefail)可以更简洁:
set -euxo pipefail
cd /etc/pki/tls/misc
temp=$( mktemp -p . )
for url in http://…blahblah…/{RootCA,IntermediateCA,IntermediateCA2}.crl ; do
curl $url | openssl crl -in - -inform DER
done > $temp
mv $temp newcrl.pem发布于 2019-09-18 14:04:45
我将前面的代码与@哦,我的天提供的提示合并。
clr_dir。代码的可读性要高得多。#!/usr/bin/env bash
set -euo pipefail
cd /etc/pki/tls/misc
crls=(RootCA IntermediateCA IntermediateCA2)
crl_temp=$(mktemp -p .)
for crl in "${crls[@]}"; do
curl -s http://url_of_crls/crl/"${crl}".crl -o "${crl}".crl
openssl crl -in "${crl}".crl -inform DER
rm -rf "${crl}".crl
done > "$crl_temp"
mv "$crl_temp" CRL.pem由于curl版本7.29.0在系统上引起的问题,我省略了curl的管道。(它在7.58.0版上运行良好。)
https://codereview.stackexchange.com/questions/229122
复制相似问题