Python 3.x Twilio拒绝LetsEncrypt证书,并带有;“证书无效”;使用Twisted Web服务器时出现错误11237

Python 3.x Twilio拒绝LetsEncrypt证书,并带有;“证书无效”;使用Twisted Web服务器时出现错误11237,python-3.x,twilio,twisted,lets-encrypt,Python 3.x,Twilio,Twisted,Lets Encrypt,我正在Ubuntu 18.04服务器上运行python3(版本3.6.9)Twisted(版本18.4.0)。此服务器用于Twilio的Webhook。Webhook在http上工作良好。我安装了一个LetsEncrypt证书,LetsEncrypt ssl证书可以很好地通过FireFox浏览器提供https服务 但是,当我将twilio指向webhook的https版本时,twilio调试器控制台中出现以下错误: Error - 11237 Certificate Invalid - Coul

我正在Ubuntu 18.04服务器上运行python3(版本3.6.9)Twisted(版本18.4.0)。此服务器用于Twilio的Webhook。Webhook在http上工作良好。我安装了一个LetsEncrypt证书,LetsEncrypt ssl证书可以很好地通过FireFox浏览器提供https服务

但是,当我将twilio指向webhook的https版本时,twilio调试器控制台中出现以下错误:

Error - 11237
Certificate Invalid - Could not find path to certificate

Twilio tried to validate your SSL certificate but was unable to find it in our certificate store. Possible Causes

    You are using a self signed certificate.
    The certificate authority you are using is not on our list of approved certificate authorities.
    Your certificate chain is incomplete and requires an additional download.

Possible Solutions

    Do not use a self signed certificate.
    Concatenate your certificate chain so that no additional download is required.
    Twilio uses CAs that are approved by Mozilla, you can find the full list here.
    For testing purposes you can disable SSL Certificate Validation in Console.
如果我按照Twilio的建议在控制台中禁用SSL证书验证,webhooks就会工作。我不想禁用SSL证书验证

以下是我在服务器上运行的代码的自包含示例:

import sys
from klein import Klein
from twisted.web.server import Site
from twisted.internet import reactor
from twisted.internet.endpoints import serverFromString
from twisted.python.log import startLogging
from [redacted] import get_data_folder_location

startLogging(sys.stdout)

klein_app = Klein()

path_to_letsencrypt_keys = get_data_folder_location()
#lensencrypt keys have been copied locally from /etc/letsencrypt/live/domain and chowned from root to local group:user
endpoint_description = "ssl:443:privateKey={0}/privkey.pem:certKey={0}/fullchain.pem".format(path_to_letsencrypt_keys)

klein_resource = klein_app.resource()
serverFromString(reactor, endpoint_description).listen(Site(klein_resource))
reactor.run()
以下是自包含示例的日志输出: 注意:日志最后一行的404是我使用FireFox通过ssl访问站点,这表明FireFox(因此Mozilla)可以使用letsencrypt ssl证书

2021-04-26 17:54:58+0000 [-] Log opened.
2021-04-26 17:54:58+0000 [-] Site (TLS) starting on 443
2021-04-26 17:54:58+0000 [-] Starting factory <twisted.web.server.Site object at 0x7fe3c57aa048>
2021-04-26 17:55:18+0000 [-] "redacted" - - [26/Apr/2021:17:55:18 +0000] "GET / HTTP/1.1" 404 233 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
2021-04-26 17:54:58+0000[-]日志已打开。
2021-04-26 17:54:58+0000[-]站点(TLS)从443开始
2021-04-26 17:54:58+0000[-]启动工厂
2021-04-26 17:55:18+0000[-]“修订”--[26/Apr/2021:17:55:18+0000]“GET/HTTP/1.1”404 233”-“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:86.0)Gecko/20100101 Firefox/86.0”
最后,这里是Qualys SSL报告的两个屏幕截图


我的问题:如何让Twilio接受我的LetsEncrypt证书?

Twisted在加载
fullchain.pem
时出现问题

您需要按照说明手动加载链

来自OpenSSL导入加密
从twisted.internet导入ssl
privkey=open('{0}/privkey.pem'.format(路径到_-letsencrypt_-keys),'rt').read()
certif=open('{0}/cert.pem'.format(指向\u-letsencrypt\u密钥的路径),'rt').read()
chain=open('{0}/chain.pem'.format(路径\u到\u-letsencrypt\u键),'rt').read()
privkeypysl=crypto.load_privatekey(crypto.FILETYPE_PEM,privkey)
certifpyssl=加密加载证书(crypto.FILETYPE\u PEM,certif)
chainpyssl=[crypto.load\u证书(crypto.FILETYPE\u PEM,chain)]
contextFactory=ssl.CertificateOptions(privateKey=privkeypyssl,certificate=certifpyssl,ExterCertChain=chainpyssl)

正如您在SSL报告中看到的,您的链不完整。Twisted似乎在加载
fullchain.pem
时出现问题。仔细阅读,看看那里的解决方案(基本上你必须手动加载链)是否能让你在SSL报告中达到a级,那么Twilio就不会再抱怨了。谢谢你,这就成功了。