2011-11-27 63 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" 
}