2011-11-27 1500 views
11

我正尝试使用lua脚本在支持SSL的服务器上检索页面。重要的是要注意,服务器有一个自签名证书。由受信任的CA颁发的证书没有问题。lua中的https请求

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可以正常工作。

回答

7

请参阅this lua-l thread描述如何使用luasec添加对luasocket https客户端的支持。

+0

我看到那个线程,但我希望找到更简单的东西。就像LuaSec文档中的[本例](http://www.inf.puc-rio.br/~brunoos/luasec/reference.html#request)一样。该方法适用于可信CA颁发的证书,但不适用于自签名证书。 – ripat

+1

另一个坏消息是我的路由器上没有足够的内存来安装LuaSec软件包。 – ripat

11

正如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" 
} 
+0

正如我上面所说的那样,lua脚本将在一个相当拥挤的路由器上执行,而LuaSec软件包没有余地。我相信我必须找到解决方法。还是要谢谢你的帮助。顺便说一句,我尝试了一个LuaSec意识框中的代码片段,它似乎没有找到'ssl.https'模块。 – ripat

+0

你使用了哪个版本的LuaSec?主站点上提供的[version 0.4.1](http://www.inf.puc-rio.br/~brunoos/luasec/download/luasec-0.4.1.tar.gz)包含ssl /https.lua应该安装到Lua包路径中。 –

+0

版本4.0。我查看了https.lua模块,它似乎创建了一个模块'ssl.module'。为什么我不能像我在第一篇文章中试图做的那样简单地使用https.lua模块?我相信这个模块来自LuaSec。 – ripat

2

这样

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