0

问题描述:

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

背景资料:

我正在尝试构建一个 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”的那些。

谢谢。

4

2 回答 2

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 中模式的更多信息,请参阅参考手册

于 2013-03-20T18:09:00.157 回答
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
于 2013-03-20T18:15:04.823 回答