3170ffee9ebf39d2528e9c4aeff4aa03.png

一开始觉得这个问题挺简单的,就是和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是明文传输),加密过程中使用了三种加密手段,分别是证书,对称加密和非对称加密。

552d62a4da205abc58c308101981f3df.png

完整的一次https请求的流程

df671df1b6ce87b32ce68499651ebbd6.png

知道了整体的流程,补充起流程中缺失的内容,让流程完整起来,就好了

  • 解决方法:

在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' ,然后就知道使用哪个证书了

信息如下:

00f62b544f2fb237961b52cc34d04050.png
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐