在后端使用python flask和ssl验证Facebook webhook订阅中的URL失败
我正在尝试从FB开始使用新的messenger平台。 所以我有一个名为www.mysite.com的服务器 我获得了该域的有效SSL证书,apache设置正确-一切正常 我的服务器上有一个运行flask的python代码,我将它指向我为服务器获得的这些证书:在后端使用python flask和ssl验证Facebook webhook订阅中的URL失败,python,facebook,ssl,flask,Python,Facebook,Ssl,Flask,我正在尝试从FB开始使用新的messenger平台。 所以我有一个名为www.mysite.com的服务器 我获得了该域的有效SSL证书,apache设置正确-一切正常 我的服务器上有一个运行flask的python代码,我将它指向我为服务器获得的这些证书: from flask import Flask, request from pymessenger.bot import Bot import requests import ipdb from OpenSSL import SSL app
from flask import Flask, request
from pymessenger.bot import Bot
import requests
import ipdb
from OpenSSL import SSL
app = Flask(__name__)
TOKEN = "<access_token>"
bot = Bot(TOKEN)
@app.route("/webhook", methods = ['GET', 'POST'])
def hello():
if request.method == 'GET':
if (request.args.get("hub.verify_token") == "my_awesome_token"):
return request.args.get("hub.challenge")
if request.method == 'POST':
output = request.json
event = output['entry'][0]['messaging']
for x in event:
if (x.get('message') and x['message'].get('text')):
message = x['message']['text']
recipient_id = x['sender']['id']
bot.send_text_message(recipient_id, message)
else:
pass
return "success"
if __name__ == "__main__":
# tried this - no luck
#context = SSL.Context(SSL.SSLv23_METHOD)
#context.use_privatekey_file('/home/mysite.com.key')
#context.use_certificate_file('/home/intermediate.crt')
# tried this - also same result
context = ('/mysite.com.crt', '/mysite.com.key')
app.run(host='www.mysite.com',port=5002, debug=True, ssl_context=context)
我在互联网上读了一半关于可能的原因的文章,看到了许多不同的建议,但这些我都做不到——我95%的时候都得到了相同的结果。5%-由于烧瓶在我尝试的一些“疯狂”设置中出错而导致其他一些错误
有什么不对劲?我正在使用从COMODO获得的证书文件。
还尝试在回调url中使用
/webhook
-也没有运气。相同错误。同时添加颁发者证书。科摩多将颁发他们自己的证书。您需要在启动服务器时包含该信息。如上面的回答所述,问题是您没有颁发者证书,这意味着无法建立安全连接。在您的情况下,可以从您的证书提供商下载这些证书。一旦有了它们,您就需要为用户提供这两种服务,以便可以建立SSL连接。根据托管方式的不同,有多种方法,但最简单的方法是将证书连接在一起。它们集中的顺序很重要,如果顺序不正确,将导致键不匹配错误。您的证书应位于第一位,然后是颁发者证书和根证书,如下所示:
-----BEGIN CERTIFICATE-----
(Your Primary SSL certificate: your_domain_name.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Your Intermediate certificate: Intermediate.crt)
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
(Your Root certificate: TrustedRoot.crt)
-----END CERTIFICATE-----
这可以通过CLI轻松完成,如下所示:
cat your_domain_name.crt Intermediate.crt TrustedRoot.crt > combined.crt
此命令按正确顺序组合3个文件,并将输出存储在名为combined.crt
的新文件中。
有关更多详细信息,请参阅。我使用certbot,让我们进行加密 遵循安装客户端软件的步骤 然后运行command=>sudo./certbot auto--apache-d YOUR_DOMAIN_NAME.COM(我单独尝试了apache、nginx和flask,都可以,无需将https放在前面) cd/etc/letsencrypt/live/YOUR_DOMAIN_NAME.COM/ 上下文=('/etc/letsencrypt/live/YOUR_DOMAIN_NAME.COM/fullchain.pem','/etc/letsencrypt/live/YOUR_DOMAIN_NAME.COM/privkey.pem')
我最初使用cert.pem而不是fullchain.pem,出现上述错误,将cert.pem更改为fullchain.pem后成功。pem您在链中缺少一些中间证书,因此链不完整,远程服务器无法成功验证您的证书。您还需要将这些中间证书放在服务器上。@CBroe与科摩多人聊天时说:“与科摩多核实一下你需要哪些,以及如何获得它们——没有多少帮助。”。我跟踪了你的链接-我看到了一些可供下载的证书。所以我需要一个?如果我有它-我该怎么处理它?(对不起,我对ssl一无所知)。UPD:他们给了我一个文件链接!:)4.07kb就是他们说的那个。我该怎么处理它呢?好的,我把这个下载的包连接到了CRT中-使用了falsk=WORKS!!!非常感谢。您需要将它放在服务器上,与主证书所在的目录相同。(不确定您是否也需要在某个地方注册它,或者将其路径放在某个地方的配置中–请咨询您的服务器管理员。)@GeekSince1982您能告诉我如何捆绑它们吗?你能解释一下吗?我也有同样的问题,我从godaddy获得了2个.crt文件(一个大,另一个小),我将通过openssl命令生成的.pem文件重命名为.key,我将这2个文件用于ssl。谢谢
cat your_domain_name.crt Intermediate.crt TrustedRoot.crt > combined.crt