0

問題の説明:

10 進数または 16 進数の値を見つけるには、正規表現/パターンを作成する必要があります

背景情報:

index.txt で証明書を検索し、シリアル番号を返す lua 関数を構築しようとしています。最終的には、証明書の完全な名前を取得して、次のコマンドを実行できるようにする必要があります。

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によると、シリアル番号は 16 進数または 10 進数のいずれかです。16進数か10進数かを誰がどのように判断するのかはまだよくわかりません(opensslを使用する他の誰かのコードを変更しています)...両方を確認する方法があるかどうか疑問に思っています。取り消されていないレコードの値のみをチェックします...別名。最初の列に「R」がないもの。

ありがとう。

4

2 に答える 2

1

残念ながら、Lua はパターンのグループ化をサポートしていないため、2 番目のタイムスタンプのパターンをオプションにすることができます。できることは、最初に 2 つのタイムスタンプ パターンをチェックすることです。一致するものが見つからない場合 (つまり、matchが返されますnil)、1 つのタイムスタンプ パターンについて繰り返します。

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

熱心な場合は、これをすべて 1 行で実行できることに注意してください。

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 に答える