【发布时间】:2020-03-30 18:53:54
【问题描述】:
这是我的案例场景...
我正在编写一个 bash 脚本来验证我的所有 VPN 证书并检查它们是否已过期。 VPN 证书(.crt 文件)通常具有关联的私钥(.pem 文件)。这些 .crt 文件中写入了一个唯一的整数序列号,.pem 文件是根据该序列号到十六进制的转换来命名的。
例子:
- 证书 john.crt 里面写有唯一的序列号,假设它是 44。
- 十六进制的 44 是 2C。因此,与 john.crt 关联的 .pem 文件将被命名为 2C.pem。
要验证证书是否已过期,我使用以下命令:
openssl verify -CAfile /etc/openvpn/keys/my-organization/ca.pem /etc/openvpn/keys/my-organization/xx.pem
所以我需要知道证书中的序列号并将它们转换为十六进制以知道所有 .pem 文件的名称。
这是我的脚本:
#!/bin/bash
serial_numbers=(`cat /etc/openvpn/keys/my-organization/*.crt | grep "Serial Number" | awk '{print $3}'`)
for number in ${serial_numbers[*]}; do
toHex=(`echo "obase=16; $number" | bc`)
for item in ${toHex[*]}; do
verify=(`openssl verify -CAfile /etc/openvpn/keys/my-organization/ca.pem /etc/openvpn/keys/my-organization/"$item".pem`)
for line in ${verify[*]}; do
echo $line
done
done
done
这可行,但对于某些人来说,我得到 没有这样的文件或目录... 某些序列号在转换为十六进制时会产生一个字母。在这种情况下,.pem 文件的名称应以 0(零)开头。
例子:
- will.crt 的序列号为 15。
- 十六进制的 15 是 F。因此,与 will.crt 关联的 .pem 文件应命名为 0F.pem。
我怎样才能通过这个并使其适用于每种情况?
【问题讨论】:
-
数组
toHex和verify只包含一个元素,不是吗? -
不,serial_numbers 包含该文件夹中的所有 .crt 文件,因此每个数组中至少有 40 个元素!
-
但是在
for number in ${serial_numbers[*]}之后,number是一个标量,而赋值toHex=(`echo "obase=16; $number" | bc`)导致toHex只包含一个元素——可能是toHex=$(echo "obase=16; $number" | bc)。 -
不知道我错过了什么,但在这里有效!这个脚本在我的工作电脑里,明天我会检查并确认我是否在这里粘贴错了。
标签: bash openssl hex vpn openvpn