You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenResty Lua模块中发起带证书的HTTPS TLS请求

在OpenResty的resty.http中配置客户端证书与CA认证

我之前在使用resty.http做客户端证书认证的时候踩过类似的坑,问题出在参数的格式要求上——你不能直接传文件名,得传入证书文件的内容才行!给你整理了一份可运行的配置示例,你可以参考下:

第一步:读取证书文件内容

resty.http的SSL相关参数需要接收文件的文本内容,所以先把CA证书、客户端证书和密钥文件读入内存:

local http = require "resty.http"
local httpc = http.new()

-- 读取CA证书
local ca_file = io.open("/绝对路径/myca.pem", "r")
if not ca_file then
    ngx.log(ngx.ERR, "无法读取CA证书文件")
    return ngx.exit(500)
end
local ca_content = ca_file:read("*a")
ca_file:close()

-- 读取客户端证书
local cert_file = io.open("/绝对路径/client.crt", "r")
if not cert_file then
    ngx.log(ngx.ERR, "无法读取客户端证书文件")
    return ngx.exit(500)
end
local cert_content = cert_file:read("*a")
cert_file:close()

-- 读取客户端密钥
local key_file = io.open("/绝对路径/client.key", "r")
if not key_file then
    ngx.log(ngx.ERR, "无法读取客户端密钥文件")
    return ngx.exit(500)
end
local key_content = key_file:read("*a")
key_file:close()

第二步:发起带SSL认证的GET请求

把读取到的内容传入对应的SSL参数中,注意参数名的正确写法:

local res, err = httpc:request_uri("https://my_server/你的校验路径", {
    method = "GET",
    ssl_verify = true, -- 生产环境建议开启证书校验
    ssl_ca_cert = ca_content, -- 传入CA证书内容
    ssl_cert = cert_content, -- 传入客户端证书内容
    ssl_key = key_content, -- 传入客户端密钥内容
    -- 如果密钥设置了密码,添加下面这行
    -- ssl_key_passphrase = "你的密钥密码"
})

if not res then
    ngx.log(ngx.ERR, "请求失败: ", err)
    return ngx.exit(500)
end

-- 处理响应结果
ngx.say(res.body)
httpc:close()

几个关键注意事项

  • 确保Nginx进程拥有证书文件的读取权限,比如把证书放在/etc/nginx/certs/目录下,并设置权限为chmod 640 /etc/nginx/certs/*,同时保证nginx用户属于对应的组。
  • 如果目标服务器使用的是自签名证书,ssl_verify设为true时必须指定ssl_ca_cert,否则会因为证书信任链不完整而校验失败;测试环境可以临时把ssl_verify设为false,但生产环境绝对不建议这么做。
  • 检查证书和密钥的格式是否为标准PEM格式,避免文件中有多余的空白字符或错误换行。

内容的提问来源于stack exchange,提问作者doktoroblivion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:33:43