需求
构建以nginx为核心防火墙时,通常采用lua与c语言动态链接库相结合的技术方案,当lua框架无法满足特定功能时,可通过在lua脚本中嵌入动态库调用实现功能拓展,接下来以检测证书生成日期与过期日期为例,具体阐述lua调用c动态库的流程
因为lua自身不包含用于验证证书的工具,所以我们必须借助c语言和相应库来开发一个so动态库,这个库将提供给lua使用,能够评估证书的有效期限、确认其合规性,并且获取证书发行方的详细信息。
c函数从lua获取参数
与lua交互的c函数,所有函数入参参数固定为 *L。
调用c函数时,在lua环境中使用 *L结构体传递参数,当只有一个参数且参数类型明确时,c函数内部通过(L,1)方式获取该参数。
当lua传递参数给c函数,并且有两个参数时,首个参数代表类型,次个参数也代表类型。在c函数内部,需借助(L,1)来取得首个参数,同时利用(L,2)来获取第二个参数。
代码说明
比如在某个代码段里,有个函数是用来查询证书到期的日期,另有个函数是用来查询证书生成的时间,这些函数需要证书的存储位置作为输入,也就是要说明是哪种类型的路径,这样就能用path = (L,1)的方式取得Lua传递过来的证书存储位置,然后就可以在C语言的函数里调用这些函数来执行一系列处理步骤。
向lua返回结果
在c函数的末尾进行结果处理,借助(L, buf)将运算成效传递给lua,此例中函数的输出包括,证书生成时刻、证书失效时刻,二者均为文本格式,因此需将输出值压入L,倘若输出为数值则另作处理。
c文件名:.c
c函数注册至lua
清单,载明了需登记的函数详情,本例仅含两个函数,即和,因而呈现如下
固定结构数组 lib 包含以下元素,每个元素都是一个结构体,结构体名为 luaL_Reg,数组以空字符结尾
{
生成证书的时间,记录下来,就是 create_cert_time,这个值要加上引号,放在花括号里面
{"证书到期时间", 到期日期},
{NULL,NULL}
};
c库入口函数
xxx标识用来封装c函数和so动态库,具体实现时,动态库的名称以.so结尾,因此函数的命名规则要遵循这个后缀,参数列表中包含动态库名称以及上面提到的lib。
打开库cert,在lua状态机中初始化,返回结果
{
将库函数集合命名为libcert,并加载到指定环境L中,同时完成相关注册工作
return 1;
}
lua代码调用c动态库
代码和说明如下
require("libcert")
--参数为证书路径
c是libcert函数create_cert_time的执行结果,该函数的参数为文件路径"./abc.cert"
e = 获取证书过期时间(文件路径为./abc.cert)
--证书创建时间
print("create time: ",c);
--证书过期时间
print("expire time: ",e);
注意:
本文采用lua5.1版本,在lua5.2版本中不存在函数,原因是lua不提倡将模块放置于全局范围,可以通过(L, c)这种方式来处理。
扫一扫在手机端查看
-
Tags : nginx+waf开发 lua调用c动态库 openssl证书检查 证书时间判断
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1