2017-03-15 125 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要求。簡單地禁用證書驗證不是一個好主意。 –