lua使用证书进行https请求

我正在尝试在_lua_中使用证书进行请求。

最近我得到了一个COMODO SSL

我尝试了许多互联网上的教程,但是都没有成功。

我发现这个博客的建议非常有趣:

我无法在Linux / OpenWRT / Lua 5.1上执行请求。

COMODO已经向我提供了以下文件:

  1. AddTrustExternalCARoot.crt
  2. my_domain_com.crt
  3. COMODORSAAddTrustCA.crt
  4. COMODORSADomainValidationSecureServerCA.crt

在该博客中他提到这些文件:

  1. key = "/root/client.key"
  2. certificate="/root/client.crt",
  3. cafile="/root/ca.crt"

如何将COMODO的.crt文件转换为博客中所提到的文件呢?

注:我试图使用curl和获取进行下载,但是没有成功。

点赞
用户1442917
用户1442917

我在博客文章中描述了细节;基本上,您需要为ssl.wrap调用指定模式和证书文件:

local params = {
  mode = "client",
  protocol = "tlsv1",
  cafile = "/path/to/downloaded/cacert.pem", --<--添加了cafile参数
  verify = "peer", --<--将"none"更改为"peer"
  options = "all",
}

如果您需要将.crt转换为.pem文件,则以下SO答案可能会有所帮助:如何从key和crt文件获取pem文件?。我没有尝试过.crt,但我使用的示例都适用于.pem文件。

2017-03-27 23:57:13
用户7776654
用户7776654

我用 这个代码 解决了它:

module("https", package.seeall)

local socket = require "socket"
local http = require "socket.http"
local ssl = require "ssl"
local ltn12 = require "ltn12"

local try = socket.try
local protect = socket.protect

local DEFAULT_PROTOCOL = "sslv23"
local DEFAULT_CAFILE = "/etc/ssl/certs/ca-certificates.crt"
local DEFAULT_VERIFY = "peer"
local DEFAULT_OPTIONS = "all"
local DEFAULT_CIPHERS = "ADH-AES256-SHA:ADH-AES128-SHA:HIGH:MEDIUM"
local DEFAULT_HTTPS_PORT = 443

local https_mt = {
    -- 通过元表为每个调用创建代理函数
    __index = function(tbl, key)
        local f = function(prxy, ...)
            local c = prxy.c
            return c[key](c, ...)
        end
        tbl[key] = f    -- 为了速度,将新的代理函数存储在缓存中
        return f
    end
}

local function new_create(params)
    return function()
        local t = { c = try(socket.tcp()) }
        function t:connect(host, port)
            try(self.c:connect(host, port))
            self.c = try(ssl.wrap(self.c, params))
            try(self.c:dohandshake())
            return 1
        end
        return setmetatable(t, https_mt)
    end
end

local function request_generic(args)
    local sslparams = {
        mode = "client",
        protocol = args.protocol or DEFAULT_PROTOCOL,
        cafile = args.cafile or DEFAULT_CAFILE,
        verify = args.verify or DEFAULT_VERIFY,
        options = args.options or DEFAULT_OPTIONS,
        ciphers = args.ciphers or DEFAULT_CIPHERS
    }
    local req = {
      url = args.url,
      port = args.port or DEFAULT_HTTPS_PORT,
      sink = args.sink,
      method = args.method,
      headers = args.headers,
      source = args.source,
      step = args.step,
      proxy = args.proxy,       -- 有缺陷吗?
      redirect = args.redirect,
      create = new_create(sslparams)
    }
    return http.request(req)
end

local function request_simple(url, body)
    local tbl = { }
    local req = {
        url = url,
        sink = ltn12.sink.table(tbl)
    }
    if body then
        req.method = "POST"
        req.source = ltn12.source.string(body)
        req.headers = {
            ["Content-length"] = #body,
            ["Content-type"] = "application/x-www-form-urlencoded"
        }
    end
    local _, status, headers = request_generic(req)
    return table.concat(tbl), status, headers
end

function request(req_or_url, body)
    if type(req_or_url) == "string" then
        return request_simple(req_or_url, body)
    else
        return request_generic(req_or_url)
    end
end
2017-03-28 11:08:21