Python请求调用使用HTTPS失败

Python请求调用使用HTTPS失败,python,json,ssl,https,python-requests,Python,Json,Ssl,Https,Python Requests,我正在AWS上的NGINX web服务器后面运行一个restful API。我用Pi中的python模块实现了这一点 当我使用HTTP调用api时,一切都很好。但我只是锁定了我的api,所以只能使用HTTPS。我更改了python模块使用的UIRL,但现在失败了。代码非常简单……以下是摘录: jsonpkg = {'subscriberID': self.api_login, 'token': self.api_token, 'content': speech_con

我正在AWS上的NGINX web服务器后面运行一个restful API。我用Pi中的python模块实现了这一点

当我使用HTTP调用api时,一切都很好。但我只是锁定了我的api,所以只能使用HTTPS。我更改了python模块使用的UIRL,但现在失败了。代码非常简单……以下是摘录:

jsonpkg = {'subscriberID': self.api_login, 'token': self.api_token,
              'content': speech_content}
headers = {'Content-Type': 'application/json'}
r = requests.post(self.api_apiurl, data=json.dumps(jsonpkg), headers=headers)
这些值由class init部分正确设置。我正在导入顶部的请求模块。错误消息表明它正在使用python 2.7。然而,当我监视API时,我可以看到它甚至没有击中服务器。我可以将浏览器指向api,它工作正常

我是否理解python 2.7中的请求模块不支持https


是否有其他参数需要通过https发送?

Aha!通过进一步挖掘请求模块文档,我找到了答案。如果我使用下面的

r = requests.post(self.api_apiurl, data=json.dumps(jsonpkg), headers=headers, verify=False)
然后它就起作用了。所以问题在于验证证书。我不太清楚为什么浏览器没有这个就可以通过了……但也许它会自动完成额外的工作。所以我要么不需要验证证书,要么有一个可以验证的本地副本(?)


最后更新:


我终于想出了如何将我的站点证书和链证书连接起来(并理解了原因)。这个网站帮了大忙。此外,一旦它们被连接,您可能会得到第二个错误,如果您搜索它,您会发现这是由于第一个证书之后第二个证书之前需要回车(使用记事本编辑生成的连接文件)造成的。然后,我可以使用“verify=True”返回帖子,这使得关于没有验证的警告消失。

要么python很旧,不支持站点可能需要的SNI(在2.7.9中实现),要么站点没有正确设置,缺少一个链证书(浏览器通常可以解决这个问题)。检查您的站点,并查找链问题或SNI要求。简单地禁用证书验证不是一个好主意。