NodeMCU强制门户网站Web服务器响应HTTP,但不响应HTTPS

时间:2019-04-30 16:41:42

标签: https esp8266 nodemcu

我正在建立一个基于this的强制门户。我的目标是使连接的任何人都可以重定向到ESP8266文件系统中存储的index.html页面,并从中导航到类似存储的其他页面。该代码通过在名为“ urls.txt”的文本文件中查找URL来区分外部站点和本地站点。只要用户尝试访问纯HTTP站点,一切都可以正常工作,但是在尝试访问HTTPS站点时不会重定向用户。例如,尝试连接到“ www.google.com”将失败,但是“ www.nerfha​​ven.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 个答案:

答案 0 :(得分:1)

您共享的代码仅在端口80(HTTP端口)上侦听。由于HTTPS使用端口443,因此它将无法响应HTTPS请求。

因此,首先,除了端口80外,您还需要监听443端口。

一旦在端口443上打开了连接,您将需要运行TLS(传输层安全性,“ HTTPS”中的“ S”)并协商安全连接,然后才能开始通过安全连接处理HTTP。 / p>

NodeMCU确实有一个TLS library,但它似乎仅作为客户端而不是服务器运行,因此,除非您找到完成此任务的其他人,否则您将独自一人在这里,这是一个很大的项目。

假设您能正常工作,那么连接到“强制门户”的任何浏览器都会左右抛出SSL证书错误,因为您的服务器正在执行TLS旨在防止的行为-模拟另一个网站。您将没有证书来证明自己是www.google.com,因此浏览器会强烈建议用户发生了某些不良情况,因此不应继续进行。

从根本上来说,首先,您没有获得HTTPS答案的原因是您没有在HTTPS端口上监听。