网上资料

引用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. 经理人和app开发者大打出手,说明这个市场已经畸形变态?

    日前,一件民生事件在网络上广为流传,成为人们热议的话题:中国平安的产品经理向app开发者提了一个需求,要求用户app的主题颜色能根据手机外壳自动调整,可能是开发人员觉得这个要求太不合理,而且感到十分绝 ...

  2. 题解【[BJOI2012]算不出的等式】

    题目背景emmm \[\text{首先特判掉p=q时的情况(ans = }p^2-1\text{)}\] \[\text{构造函数}f(k) = \left\lfloor \frac{kq}{p}\r ...

  3. 化 Bernoulli 方程为一阶线性微分方程

    形如 $ {\displaystyle \frac{dy}{dx}+p(x)y=q(x)y^n(n\neq 0,1) \ \ \ \ \ (1)}$ 的方程为 Bernoulli 方程.现在我们考虑其 ...

  4. go语言实现leetcode-242

    package main import ( "fmt" "reflect" ) func isAnagram(s string, t string) bool ...

  5. 小程序Java多次请求Session不变

    微信小程序每次请求的sessionid是变化的,导致对应后台的session不一致,无法获取之前保存在session中的openid和sessionKey. 为了解决这个问题,需要强制同意每次小程序前 ...

  6. Java之线程通信的应用:经典例题:生产者/消费者问题

    /** * 线程通信的应用:经典例题:生产者/消费者问题 * * 生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处取走产品, * 店员一次只能持有固定数量 ...

  7. upstream实现内网网站在公网访问

    背景描述:公司内网有个网站aa.com,B部门需要访问这个aa.com,但是网站部署在内网服务器(服务器是192.168.1网段),B部门网段是192.168.100 需求描述:B部门需要访问aa.c ...

  8. pycharm编辑快捷键

    pycharm编辑快捷键 序号 快捷键 作用 1 CTRL + ALT + SPACE 快速导入任意类 2 CTRL + SHIFT + ENTER 代码补全 3 SHIFT + F1 查看外部文档 ...

  9. hdu 1246

    很久没有写题解了~因为懒(年纪大了就是脸皮厚,还有脸说) 这道题今天花了很长时间去推,一开始以为是规律题,没推出来,直接模拟也TLE了,接着考虑实在是没思路,看了题解. 思路大概就是这样: 先上代码( ...

  10. java常用工具类(一)

    一.String工具类 package com.mkyong.common; import java.util.ArrayList; import java.util.List; /** * * St ...