如何在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
相关产品推荐
相关产品推荐

