TLS ### .. role:: example-rule-emphasis TLS详细信息通过``suricata.tls``库暴露给Lua脚本,例如:: local tls = require("suricata.tls") 初始化 ***** 如果目的是创建日志脚本,按如下方式初始化缓冲区: :: function init (args) local needs = {} needs["protocol"] = "tls" return needs end 如果是检测脚本则使用:: function init (args) return {} end API *** 事务处理 =========== TLS基于事务处理,使用前必须先获取当前事务:: local tx, err = tls.get_tx() if tx == nil then print(err) end 所有其他函数都是事务表的方法。 客户端方法 ============== ``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 ``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 ``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 ``get_client_cert_not_after`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 获取证书有效期的结束时间Unix时间戳。 示例: :: function log (args) notafter = t:get_client_cert_not_after() if notafter < os.time() then -- 已过期证书 end end ``get_client_cert_not_before`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 获取证书有效期的开始时间Unix时间戳。 示例: :: function log (args) notbefore = t:get_client_cert_not_before() if notbefore > os.time() then -- 尚未生效的证书 end end ``get_client_serial`` ~~~~~~~~~~~~~~~~~~~~~ 通过``get_client_serial``获取TLS证书序列号。 示例: :: function log (args) serial = t:get_client_serial() if serial ~= nil then -- 执行操作 end end ``get_client_sni`` ~~~~~~~~~~~~~~~~~~ 从TLS连接中获取服务器名称指示(SNI)。 示例: :: function log (args) asked_domain = t:get_client_sni() if string.find(asked_domain, "badguys") then -- 连接到可疑域名时的处理 end end 服务端方法 ============== ``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 ``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 ``get_server_cert_not_after`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 获取证书有效期的结束时间Unix时间戳。 示例: :: function log (args) notafter = t:get_server_cert_not_after() if notafter < os.time() then -- 已过期证书 end end ``get_server_cert_not_before`` ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 获取证书有效期的开始时间Unix时间戳。 示例: :: function log (args) notbefore = t:get_server_cert_not_before() if notbefore > os.time() then -- 尚未生效的证书 end end ``get_server_serial`` ~~~~~~~~~~~~~~~~~~~~~ 通过``get_server_serial``获取TLS证书序列号。 示例: :: function log (args) serial = t:get_server_serial() if serial ~= nil then -- 执行操作 end end