2011-11-27 24 views
11

Sto cercando di recuperare una pagina sul mio server abilitato SSL con uno script lua. Importante notare che il server ha un certificato autofirmato. Nessun problema con il certificato emesso da una CA attendibile.richiesta https in lua

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

Il server restituisce:

Bad Request Il tuo browser ha inviato una richiesta che questo server non riusciva a capire. Motivo: si sta parlando semplicemente di HTTP a una porta del server abilitata per SSL. Usa invece lo schema HTTPS per accedere a questo URL, per favore.

E sul lato server, che producono richiesta di questa voce nel Apache ssl_access.log

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

Inoltre, tcpdump mostra che dopo la stretta di mano SYN-ACK, senza SSL 257 Client Hello viene inviato. Usando lo stesso URL dal mio browser o con wget funziona bene.

risposta

7

Vedere this lua-l thread che descrive come aggiungere il supporto per il client https luasocket utilizzando luasec.

+0

Ho visto quel thread ma speravo di trovare qualcosa di più semplice. Come in [questo esempio] (http://www.inf.puc-rio.br/~brunoos/luasec/reference.html#request) dalla documentazione di LuaSec. Questo metodo funziona bene con certificati emessi dalla CA attendibile ma non su quelli autofirmati. – ripat

+1

Un'altra brutta notizia è che non ho abbastanza memoria sul mio router per installare il pacchetto LuaSec. – ripat

11

Come ha detto Doug Currie, è necessario utilizzare luasec. Al fine di consentire https.request, si deve richiedere il modulo 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

Come ho detto sopra, lo script lua verrà eseguito su un router piuttosto limitato che non ha spazio per il pacchetto LuaSec. Credo che dovrò trovare una soluzione alternativa. Grazie comunque per il tuo aiuto. E BTW ho provato il tuo snippet in una scatola sensibile LuaSec e non sembra trovare il modulo 'ssl.https'. – ripat

+0

Quale versione di LuaSec hai usato? La [versione 0.4.1] (http://www.inf.puc-rio.br/~brunoos/luasec/download/luasec-0.4.1.tar.gz), disponibile sul sito principale, contiene ssl /https.lua che dovrebbe essere installato nel percorso del pacchetto Lua. –

+0

Versione 4.0. Ho dato uno sguardo al modulo https.lua e sembra che crei un modulo 'ssl.module'. Perché non posso semplicemente usare il modulo https.lua come ho cercato di fare nel mio primo post? Questo modulo è derivato da LuaSec, credo. – ripat

2

come questo

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