TLS ###

TLS详细信息通过``suricata.tls``库暴露给Lua脚本,例如:

local tls = require("suricata.tls")

20.3.33. 初始化

如果目的是创建日志脚本,按如下方式初始化缓冲区:

function init (args)
   local needs = {}
   needs["protocol"] = "tls"
   return needs
end

如果是检测脚本则使用:

function init (args)
  return {}
end

20.3.34. API

20.3.34.1. 事务处理

TLS基于事务处理,使用前必须先获取当前事务:

local tx, err = tls.get_tx()
if tx == nil then
    print(err)
end

所有其他函数都是事务表的方法。

20.3.34.2. 客户端方法

20.3.34.2.1. get_client_version

通过``get_client_version``获取TLS会话中协商的版本字符串。

示例:

function log (args)
    t, err = tls.get_tx()
    version = t:get_client_version()
    if version ~= nil then
        -- 执行操作
    end
end

20.3.34.2.2. get_client_cert_chain

通过``get_client_cert_chain``向脚本提供证书链

输出是一个证书数组,每个证书都是包含`data`和`length`键的哈希表。

示例:

-- 使用来自https://github.com/wahern/luaossl的debian lua-luaossl
local x509 = require"openssl.x509"

   chain = t:get_client_cert_chain()
   for k, v in pairs(chain) do
      -- v.length是数据长度
      -- v.data是证书的原始二进制数据
      print("data length is" .. v["length"] .. "\n")
      cert = x509.new(v["data"], "DER")
      print(cert:text() .. "\n")
   end

20.3.34.2.3. get_client_cert_info

通过``get_client_cert_info``向脚本提供证书信息

示例:

function log (args)
    version, subject, issuer, fingerprint = t:get_client_cert_info()
    if version ~= nil then
        -- 执行操作
    end
end

20.3.34.2.4. get_client_cert_not_after

获取证书有效期的结束时间Unix时间戳。

示例:

function log (args)
    notafter = t:get_client_cert_not_after()
    if notafter < os.time() then
        -- 已过期证书
    end
end

20.3.34.2.5. get_client_cert_not_before

获取证书有效期的开始时间Unix时间戳。

示例:

function log (args)
    notbefore = t:get_client_cert_not_before()
    if notbefore > os.time() then
        -- 尚未生效的证书
    end
end

20.3.34.2.6. get_client_serial

通过``get_client_serial``获取TLS证书序列号。

示例:

function log (args)
    serial = t:get_client_serial()
    if serial ~= nil then
        -- 执行操作
    end
end

20.3.34.2.7. get_client_sni

从TLS连接中获取服务器名称指示(SNI)。

示例:

function log (args)
    asked_domain = t:get_client_sni()
    if string.find(asked_domain, "badguys") then
        -- 连接到可疑域名时的处理
    end
end

20.3.34.3. 服务端方法

20.3.34.3.1. get_server_cert_info

通过``get_server_cert_info``向脚本提供证书信息

示例:

function log (args)
    version, subject, issuer, fingerprint = t:get_server_cert_info()
    if version ~= nil then
        -- 执行操作
    end
end

20.3.34.3.2. get_server_cert_chain

通过``get_server_cert_chain``向脚本提供证书链

输出是一个证书数组,每个证书都是包含`data`和`length`键的哈希表。

示例:

-- 使用来自https://github.com/wahern/luaossl的debian lua-luaossl
local x509 = require"openssl.x509"

   chain = t:get_server_cert_chain()
   for k, v in pairs(chain) do
      -- v.length是数据长度
      -- v.data是证书的原始二进制数据
      print("data length is" .. v["length"] .. "\n")
      cert = x509.new(v["data"], "DER")
      print(cert:text() .. "\n")
   end

20.3.34.3.3. get_server_cert_not_after

获取证书有效期的结束时间Unix时间戳。

示例:

function log (args)
    notafter = t:get_server_cert_not_after()
    if notafter < os.time() then
        -- 已过期证书
    end
end

20.3.34.3.4. get_server_cert_not_before

获取证书有效期的开始时间Unix时间戳。

示例:

function log (args)
    notbefore = t:get_server_cert_not_before()
    if notbefore > os.time() then
        -- 尚未生效的证书
    end
end

20.3.34.3.5. get_server_serial

通过``get_server_serial``获取TLS证书序列号。

示例:

function log (args)
    serial = t:get_server_serial()
    if serial ~= nil then
        -- 执行操作
    end
end