网上资料

引用ssl.https 包

local https = require("ssl.https")

之后按同http一样调用。

但是,这种只最基本的实现了访问https服务的要求,却没有验证数字证书的示例说明。

数字证书的调用

类似

wget --private-key /root/client.key --certificate /root/client.crt    --ca-certificate /root/ca.crt https://www.test.com -O wgetssl

curl --key /root/client.key --cert /root/client.crt    --cacert /root/ca.crt https://www.test.com

必须要传入证书文件

再搜 资料很少

最有用的是

http://notebook.kulchenko.com/programming/https-ssl-calls-with-lua-and-luasec

讲的是socket 建立连接,和https差了一层。

就差一步了……

再也没找到任何资料。

所以,查lua包源码

https的部分内容

local ssl    = require("ssl")
function request(url, body)
local result_table = {}
local stringrequest = type(url) == "string"
if stringrequest then
url = urlstring_totable(url, body, result_table)
else
url.url = default_https_port(url.url)
end
if http.PROXY or url.proxy then
return nil, "proxy not supported"
elseif url.redirect then
return nil, "redirect not supported"
elseif url.create then
return nil, "create function not permitted"
end
-- New 'create' function to establish a secure connection
url.create = tcp(url)
local res, code, headers, status = http.request(url)
if res and stringrequest then
return table.concat(result_table), code, headers, status
end
return res, code, headers, status
end -- Return a function which performs the SSL/TLS connection.
local function tcp(params)
params = params or {}
-- Default settings
for k, v in pairs(cfg) do
params[k] = params[k] or v
end
-- Force client mode
params.mode = "client"
-- 'create' function for LuaSocket
return function ()
local conn = {}
conn.sock = try(socket.tcp())
local st = getmetatable(conn.sock).__index.settimeout
function conn:settimeout(...)
return st(self.sock, ...)
end
-- Replace TCP's connection function
function conn:connect(host, port)
try(self.sock:connect(host, port))
self.sock = try(ssl.wrap(self.sock, params))
try(self.sock:dohandshake())
reg(self, getmetatable(self.sock))
return
end
return conn
end
end

https.request

url.create = tcp(url)

会调用tcp函数。

params = params or {}
-- Default settings
for k, v in pairs(cfg) do
params[k] = params[k] or v
end 
self.sock = try(ssl.wrap(self.sock, params))

而tcp函数又用requset传入的参数创建名为 params的table类对象,传入params调用ssl.warp函数

好吧,再去ssl函数看源码

function newcontext(cfg)

   local succ, msg, ctx

   -- Create the context

   ctx, msg = context.create(cfg.protocol)

   if not ctx then return nil, msg end

   -- Mode

   succ, msg = context.setmode(ctx, cfg.mode)

   if not succ then return nil, msg end

   -- Load the key

   if cfg.key then

      succ, msg = context.loadkey(ctx, cfg.key, cfg.password)

      if not succ then return nil, msg end

   end

   -- Load the certificate

   if cfg.certificate then

      succ, msg = context.loadcert(ctx, cfg.certificate)

      if not succ then return nil, msg end

   end

   -- Load the CA certificates

   if cfg.cafile or cfg.capath then

      succ, msg = context.locations(ctx, cfg.cafile, cfg.capath)

      if not succ then return nil, msg end

   end

   -- Set the verification options

   succ, msg = optexec(context.setverify, cfg.verify, ctx)

   if not succ then return nil, msg end

   -- Set SSL options

   succ, msg = optexec(context.setoptions, cfg.options, ctx)

   if not succ then return nil, msg end

   -- Set the depth for certificate verification

   if cfg.depth then

      succ, msg = context.setdepth(ctx, cfg.depth)

      if not succ then return nil, msg end

   end

   return ctx

end

--

--

--

function wrap(sock, cfg)

   local ctx, msg

   if type(cfg) == "table" then

      ctx, msg = newcontext(cfg)

      if not ctx then return nil, msg end

   else

      ctx = cfg

   end

   local s, msg = core.create(ctx)

   if s then

      core.setfd(s, sock:getfd())

      sock:setfd(core.invalidfd)

      return s

   end

   return nil, msg 

end

眼前一亮,看到熟悉的证书参数了,key,password,ca...

懂的看代码就该如何作了。

首先wrap调用newcontext

而newcontext应用 之前request传入的参数

那把key,password,ca等,写入https.request就全通了。

写demo

测试通过。

不传证书

#!/usr/bin/lua
require("socket")
local https = require("ssl.https") local one, code, headers, status = https.request{
url = "https://www.test.com"
}
print(code)
print(header)
print(status)
print(one)

结果为

root@LeWiFi:~# lua luahttps.test
nil
nil
nil
nil

传入证书

#!/usr/bin/lua
require("socket")
local https = require("ssl.https")
local one, code, headers, status = https.request{
url = "https://www.test.com",
key = "/root/client.key",
certificate="/root/client.crt",
cafile="/root/ca.crt"
}
print(code)
print(header)
print(status)
print(one)

结果

root@LeWiFi:~# lua luahttps.test 

nil
HTTP/1.1 OK

success

												

lua https request 调用的更多相关文章

  1. tengine lua 开源一 调用内部接口高效发送文件

    tengine  lua 开源一 调用内部接口高效发送文件 开源自己封装的sendfile 模块,可以高效的通过lua发送文件 源码地址:https://github.com/weinyzhou/Lu ...

  2. C程序与Lua脚本相互调用

    Lua脚本是一种可用于C程序开发/测试的工具,本篇介绍一下C程序与Lua脚本如何进行相互调用,更加详细的操作参见<Programing in Lua>.本文分为3个部分:1.Windows ...

  3. 使用soapUI代替WSDL2JAVA生成cxf HTTPS 客户端调用代码

    如果直接用cxf下面的wsdl2java生成https服务调用代码,会报https证书的错误.在你不想导入证书的情况下,可以使用soapUI进行客户端代码的生成,步骤如下: 1.设置CXF,如下图: ...

  4. InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised.解决办法

    最近使用requests进行get请求的时候,控制台输出如下错误. InsecureRequestWarning: Unverified HTTPS request is being made. Ad ...

  5. ubuntu配置lua环境,并进行c与lua的相互调用

    1.安装lua环境 先查看一下apt可获取的lua版本 我们选择lua5.1版本进行安装 sudo apt install lua5.1 安装完之后测试一下是否安装成功,如果可以正常使用,则lua环境 ...

  6. InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings In

    InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is s ...

  7. pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)

    前言 使用 pytest 执行 https 请求用例的时候,控制台会出现警告:InsecureRequestWarning: Unverified HTTPS request is being mad ...

  8. (原)lua使用ffi调用c程序的函数

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5812763.html 参考网址: http://luajit.freelists.narkive.co ...

  9. openresty+lua做接口调用权限限制

    说明:openresty可以理解为一个服务器它将nginx的核心包含了过来,并结合lua脚本语言实现一些对性能要求高的功能,该篇文章介绍了使用openresty 1.purview.lua --调用j ...

随机推荐

  1. ADS1.2 调试问题

    最近一个程序需要用到ADS1.2这个软件,在使用过程中出现了如下问题: 1.由于以前用的是KEIL,所以没找到文件的工程,查资料才发现,这个工程文件打开的文件是MCP格式的文件: 2.调试的时候,没找 ...

  2. 1811 06 pygame 的继续开发

    早上看了  高数和python   好像系统没有保存  桑心啊 关于游戏背景的制作 游戏背景就是    背景在移动  而主人物还在原位置的    常常用于跑酷游戏类  背景开始绘制两张图像  一张完全 ...

  3. strpos用法

    语法 strpos(string,find,start) 参数 描述 string 必需.规定要搜索的字符串. find 必需.规定要查找的字符串. start 可选.规定在何处开始搜索.   技术细 ...

  4. POJ-1015 Jury Compromise(dp|01背包)

    题目: In Frobnia, a far-away country, the verdicts in court trials are determined by a jury consisting ...

  5. PAT Advanced 1033 To Fill or Not to Fill (25) [贪⼼算法]

    题目 With highways available, driving a car from Hangzhou to any other city is easy. But since the tan ...

  6. ZJNU 1422 - 碰撞的小球

    完全弹性碰撞可以视作互相穿过 所以直接考虑只有单个小球的时候,从板子上滑下所需要的时间即可 最后以30000为界分开流读入与缓冲区优化的io方法 //Case4用缓冲区io优化会WA??? /* Wr ...

  7. BZOJ4422[Cerc2015]Cow Confinement(扫描线+线段树)

    很容易发现一个O(n2)DP,f[i][j]=f[i][j+1]+f[i+1][j]-f[i+1][j+1].然后由于有栅栏,一些位置没办法走,然后就可以用类似差分的方法,f[i]表示当前行f[i+1 ...

  8. JSONP 跨域问题

    JSONP跨域请求   什么是跨域: 1.域名不同 2.域名相同端口不同 js出于对安全考虑不支持跨域请求.我们可以使用JSONP解决跨域问题. 一.JSONP是什么 JSONP(JSON with ...

  9. Windows10配置Jmeter环境

    注:在安装Jmeter之前,请先检查下电脑有没有装JDK:[Win+R]然后输入cmd->进入命令行界面,输入java -version 出现以下信息就是此电脑已安装了JDK.由于jmeter要 ...

  10. mongo客户端升级导致pymongo中使用聚合函数时出现异常

    一.异常信息 The 'cursor' option is required, except for aggregate with the explain argument 二.解决办法 #部分源代码 ...