一开始觉得这个问题挺简单的,就是和http请求一样,无非就是把http改成https, 所以也是这么做的,然后发现,太草率了~
事情没那么简单,应该也算是被Python好用的体系给带节奏了,对一些类库细节没有做过多的了解。
这次在OpenResty里用的是resty/http的库,按照正常情况下做请求,如下
local zhttp = require "resty.http"local msg_httpc = zhttp.new()msg_httpc:request_uri("https://www.xxxx.com/cgi-bin/gettoken?xxxx", { method = "GET", headers = { ["User-Agent"] = "qyweixin", } })
然而报错了! OMG
unable to get local issuer certificate
HTTPS相比于HTTP多了一层SSL/TSL,是加密传输的(http是明文传输),加密过程中使用了三种加密手段,分别是证书,对称加密和非对称加密。
完整的一次https请求的流程
知道了整体的流程,补充起流程中缺失的内容,让流程完整起来,就好了
- 解决方法:
在nginx.conf里加入如下配置
lua_ssl_verify_depth 10; # ubuntu server # lua_ssl_trusted_certificate '/etc/ssl/certs/ca-certificates.crt'; #mac lua_ssl_trusted_certificate '/etc/ssl/cert.pem';
加入之后,就可以正常来做请求了,条件就都满足了, 验证下来也确实可以请求成功了。
其中,lua_ssl_trusted_certificate的值怎么获取呢?*inux系统,可以通过
curl -v -s -l 'https://www.xxxx.com/cgi-bin/gettoken?xxxx' ,然后就知道使用哪个证书了
信息如下: