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

时间:2013-03-20 17:58:24

标签: lua openssl pattern-matching

问题描述:

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

背景资料:

我正在尝试构建一个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的其他人的代码)...但我想知道是否有办法检查两者。我只会检查不是Revoked ... aka的记录的值。第一栏中没有“R”的那些。

感谢。

2 个答案:

答案 0 :(得分:1)

遗憾的是,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中模式的更多信息,请参阅reference manual

答案 1 :(得分:1)

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'
}

-- for 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

-- for Lua 5.2
for _, crt in ipairs(cert) do
   local serial = crt:match'^%S+%s+%S+.-%f[%S](%x+)%f[%s]'
   print(serial)
end