如何使用openssl的index.txt建立完整的证书名称,包括序列号

问题描述:

我需要构建一个正则表达式/模式,以查找可以是十进制或十六进制的值。

背景信息:

我正在尝试构建一个 lua 函数,它将在 index.txt 中查找证书并返回序列号。最终,我需要能够获取完整的证书名称并运行以下命令:

OpenSSL x509 -noout -in /etc/ssl/cert/myusername.6A756C65654063616E2E77746274732E6E6574.8F.crt -dates

我已经有了构建文件名的逻辑,一直到上面例子中的序列号...这是 8F。

这是 index.txt 文件的样子:

R   140320154649Z   150325040807Z   8E  unknown /CN=test@gmail.com/emailAddress=test@gmail.com
V   160324050821Z       8F  unknown /CN=test@yahoo.com/emailAddress=test@yahoo.com
V   160324051723Z       90  unknown /CN=test2@yahoo.com/emailAddress=test2@yahoo.com

序列号是第一个记录中的字段 4,在其他记录中是字段 3。 根据文档 https://www.openssl.org/docs/apps/x509.html,序列号可以是十六进制或十进制。 我还不确定是如何/谁确定它是十六进制还是十进制的(我正在修改其他人使用 openssl 的代码)...但我想知道是否有一种方法来检查这两种情况。我只会检查未被吊销的记录的值...也就是第一列中没有“R”的记录。

谢谢。

点赞
用户1633117
用户1633117

Lua不幸地不支持模式分组,因此您无法将第二个时间戳的模式设置为可选项。您可以先检查两个时间戳的模式,如果没有找到匹配项(这意味着match返回nil),则重复一次单时间戳的模式:

sn = string.match(line, "^%a%s+%d+Z%s+%d+Z%s+(%x+)")
if not sn then
    sn = string.match(line, "^%a%s+%d+Z%s+(%x+)")
end

请注意,如果您急切地想要完成这个操作,您可以在一行中完成它:

sn = string.match(line, "^%a%s+%d+Z%s+%d+Z%s+(%x+)") or string.match(line, "^%a%s+%d+Z%s+(%x+)")

每组括号捕获所匹配的内容并添加一个返回值。有关Lua中模式的更多信息,请参见参考手册

2013-03-20 18:09:00
用户1847592
用户1847592
local cert = {
   'R   140320154649Z   150325040807Z    8E  unknown /CN=test@gmail.com/emailAddress=test@gmail.com',
   'V   160324050821Z       8F  unknown /CN=test@yahoo.com/emailAddress=test@yahoo.com',
   'V   160324051723Z       90  unknown /CN=test2@yahoo.com/emailAddress=test2@yahoo.com'
}

-- 对于 Lua 5.1
for _, crt in ipairs(cert) do
   local n3, n4 = crt:match'^%S+%s+%S+%s+(%S+)%s+(%S+)'
   local serial  = n3:match'^%x+$' or n4:match'^%x+$'
   print(serial)
end

-- 对于 Lua 5.2
for _, crt in ipairs(cert) do
   local serial = crt:match'^%S+%s+%S+.-%f[%S](%x+)%f[%s]'
   print(serial)
end
2013-03-20 18:15:04