题 lua中的https请求


我正在尝试使用lua脚本在启用SSL的服务器上检索页面。需要注意的是,服务器具有自签名证书。受信任的CA颁发的证书没有问题。

local https = require("socket.http")
local resp = {}
local r, c, h, s = https.request{
    url = "https://my-server:443/example.php",
    sink = ltn12.sink.table(resp),
    protocol = "tlsv1"
}

服务器返回:

错误的请求   您的浏览器发送了此服务器无法理解的请求。   原因:您正在向支持SSL的服务器端口说明HTTP。   请改为使用HTTPS方案访问此URL。

在服务器端,该请求在Apache ssl_access.log中生成此条目

192.168.0.150 - - [27/Nov/2011:16:32:07 +0100] "GET /" 400 529 "-" "-"

此外,tcpdump显示在SYN-ACK握手之后,没有 SSL 257 Client Hello 已发送。使用我的浏览器或wget使用相同的URL工作正常。


12
2017-11-27 15:36


起源




答案:


正如Doug Currie所说,你应该使用 luasec。为了启用 https.request,你必须要求 ssl.https 模块:

local https = require 'ssl.https'
local r, c, h, s = https.request{
    url = "https://my-server:443/example.php",
    sink = ltn12.sink.table(resp),
    protocol = "tlsv1"
}

11
2017-11-27 21:18



正如我上面所说的那样,lua脚本将在一个相当狭窄的路由器上执行,该路由器没有留给LuaSec软件包的空间。我相信我必须找到一个解决方法。还是要谢谢你的帮助。顺便说一下,我在LuaSec识别框中尝试了你的代码片段,它似乎没有找到'ssl.https'模块。 - ripat
您使用的是哪个版本的LuaSec?该 版本0.4.1,在主站点上可用,包含应安装到Lua包路径中的ssl / https.lua。 - Michal Kottman
版本4.0。我查看了https.lua模块,它似乎创建了一个模块 ssl.module。为什么我不能像我在第一篇文章中那样简单地使用https.lua模块?该模块源自LuaSec,我相信。 - ripat
因为您正在导入 socket.http 模块,它对HTTPS一无所知(这里讨论)。这就是您需要加载自定义模块的原因。当然,您可以将它放在任何您喜欢的地方,例如在$ LUA_PATH / socket / https.lua中,然后您可以将其称为 require 'socket.https'。 - Michal Kottman
链接到luasec已被破坏。但也许吧 这个链接可以取代旧链接 - yair


看到 这个lua-l线程 描述如何使用添加对luasocket https客户端的支持 luasec


7
2017-11-27 16:46



我看到那个帖子,但我希望能找到更简单的东西。像 这个例子 来自LuaSec文档。该方法适用于受信任CA颁发的证书,但不适用于自签名证书。 - ripat
另一个坏消息是我的路由器上没有足够的内存来安装LuaSec软件包。 - ripat


喜欢这个

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"
}

2
2017-07-17 07:14





更现代的解决方案是使用lua-http: https://github.com/daurnimator/lua-http

它配有luasocket / luasec兼容接口。


1
2017-07-23 00:14



它可以在Windows上使用吗? - Milind