2017-03-15 76 views
0

我在AWS上的NGINX Web服务器后面运行Flask restful API。我用我的Pi中的python模块打这个。Python请求调用失败,HTTPS

当我使用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) 

这些值由init init部分正确设置。我正在导入顶部的请求模块。错误消息表明它正在使用python 2.7。但是,当我监视API时,我可以看到它甚至没有触及服务器。我可以将浏览器指向api并且它的工作正常。

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

我需要为https发送附加参数吗?

回答

0

啊哈!稍微深入了解请求模块文档后,我找到了答案。如果我使用以下

r = requests.post(self.api_apiurl, data=json.dumps(jsonpkg), headers=headers, verify=False) 

然后它工作。所以问题在于验证证书。我不确定浏览器为什么没有这个功能......但也许它会自动完成额外的工作。所以我要么不需要验证证书,要么有一个可以验证的本地副本(?)。


最后更新:

我终于摸索出如何连接与链证书我的网站证书(并理解为什么)。这个网站here是一个很大的帮助。此外,一旦它们连接在一起,你可能会得到第二个错误,如果你谷歌,你会发现是由于需要在第一个证书之后和第二个之前的回车(用记事本编辑生成的连接文件)造成的。然后,我能够使用“verify = True”返回帖子,这使得关于不验证的警告消失。

+0

python是旧的,不支持网站可能需要的SNI(已在2.7.9中实现),或者网站未正确设置并缺少链式证书(浏览器通常会解决此问题)。使用[SSLLabs](https://www.ssllabs.com/ssltest/analyze.html)检查您的网站,并查找连锁问题或SNI要求。简单地禁用证书验证不是一个好主意。 –