Веб-сервер портала авторизации NodeMCU отвечает на запросы HTTP, но не HTTPS. - PullRequest
0 голосов
/ 30 апреля 2019

Я настраиваю аналогичный портал на основе this .Моя цель состоит в том, чтобы любой, кто подключается, был перенаправлен и обслуживал страницу index.html, хранящуюся в файловой системе ESP8266, с которой он может перемещаться на другие страницы, сохраненные аналогичным образом.Код различает иностранные сайты и локальные сайты, просматривая URL в текстовом файле с именем «urls.txt».Все работает нормально, при условии, что пользователь пытается посетить сайт с чистым http, но пользователь не перенаправляется при попытке посетить сайт HTTPS.Например, попытка подключиться к «www.google.com» не удастся, но «www.nerfhaven.com» будет успешным.

Вот код из server.lua:

srv=net.createServer(net.TCP) 
srv:listen(80,function(conn) 

   local rnrn=0
   local Status = 0
   local DataToGet = 0
   local method=""
   local url=""
   local vars=""

  conn:on("receive",function(conn,payload)

    if Status==0 then
        _, _, method, url, vars = string.find(payload, "([A-Z]+) /([^?]*)%??(.*) HTTP")
        -- print(method, url, vars)                          
    end

[...]

    conn:send("HTTP/1.1 200 OK\r\n\r\n")  

[...]

local foundmatch = 0    

    file.open("urls.txt", "r") 
    print("potato")
        for i = 108,1,-1 do
            line = file.readline()
            --print(line)
            if string.match(line, url) then
                foundmatch=1
                print("found " .. url)

            end
        end
        print("potato2")
        file.close()

[...]

  conn:on("sent",function(conn) 
  print("sending data")
    if DataToGet>=0 and method=="GET" then
        if file.open(url, "r") then            
            file.seek("set", DataToGet)
            local line=file.read(512)
            file.close()
            if line then
                conn:send(line)
                -- print ("sending:" .. DataToGet)
                DataToGet = DataToGet + 512    
                if (string.len(line)==512) then
                    return
                end
            end
        end        
    end

    conn:close() 
  end)
end)  

Я думаю, это должно сработать, поскольку я не вижу способа провести различие между веб-сайтами HTTP и HTTPS, и любой из них следует просто отключить и заменить на локальную версию.(либо index.html, либо что-то в urls.txt).Вместо этого он, похоже, вообще не отвечает.

1 Ответ

1 голос
/ 30 апреля 2019

Код, которым вы поделились, прослушивает только порт 80 - порт HTTP.Он не сможет отвечать на запросы HTTPS, потому что HTTPS использует порт 443.

Итак, сначала вам нужно будет прослушивать порт 443 в дополнение к порту 80.

Как только вы получитесоединение, открытое через порт 443. Вам потребуется запустить TLS (Transport Layer Security, 'S' в 'HTTPS') и согласовать безопасное соединение, прежде чем вы сможете начать обработку HTTP через защищенное соединение.

NodeMCUдействительно имеет библиотеку TLS , но, похоже, она работает только как клиент, а не как сервер, поэтому, если вы не можете найти кого-то еще, кто сделал это, вы здесь, и это большой проект.

Предполагая, что вы работаете, любой браузер, который подключается к вашему «захваченному порталу», будет выдавать ошибки сертификата SSL влево и вправо, потому что ваш сервер делает именно то, что предотвращает TLS - олицетворение другого веб-сайта.У вас не будет сертификатов, подтверждающих, что вы www.google.com, поэтому браузер настоятельно рекомендует пользователям, что происходит что-то плохое, и они не должны предпринимать дальнейшие действия.

Принципиально и в первую очередь, однако,причина, по которой вы не получаете ответа по HTTPS, заключается в том, что вы не слушаете порт HTTPS.

...