<p>电报机器人程序仅适用于全链证书。以及getWebHookInfo中的错误:</p>
<pre><code>"last_error_message":"SSL error {337047686, error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed}"
</code></pre>
<p>是电报说它需要整个证书链(也称为CA包或全链证书)。正如在<a href="https://stackoverflow.com/questions/49308744/telegram-bot-ssl-error-ssl-error-error1416f086ssl-routinestls-process-serve">question</a>上所回答的那样</p>
<p>如果使用<a href="https://www.ssllabs.com/" rel="nofollow noreferrer">SSLlabs</a>验证证书,您将看到您的域存在链问题:</p>
<p><a href="https://www.ssllabs.com/ssltest/analyze.html?d=www.vallotta-party-bot.com&hideResults=on" rel="nofollow noreferrer">https://www.ssllabs.com/ssltest/analyze.html?d=www.vallotta-party-bot.com&hideResults=on</a></p>
<p>要解决此问题,您需要设置CA证书。这样,您需要通过CA提供商查找CA证书文件</p>
<p>此外,在生产现场最好的选择是使用<a href="https://gunicorn.org/" rel="nofollow noreferrer">gunicorn</a>而不是烧瓶</p>
<p>如果您使用的是gunicorn,则可以使用命令行参数执行此操作:</p>
<pre><code>$ gunicorn certfile cert.pem keyfile key.pem ca_certs cert.ca-bundle -b 0.0.0.0:443 hello:app
</code></pre>
<p>或创建具有以下内容的<code>gunicorn.py</code>:</p>
<pre><code>import multiprocessing
bind = "0.0.0.0:443"
workers = multiprocessing.cpu_count() * 2 + 1
timeout = 120
certfile = "cert/certfile.crt"
keyfile = "cert/service-key.pem"
ca_certs = "cert/cert.ca-bundle"
loglevel = 'info'
</code></pre>
<p>并按如下方式运行:</p>
<pre><code>gunicorn config=gunicorn.py hello:app
</code></pre>
<p>如果您使用Nginx作为反向代理,那么您可以使用Nginx配置证书,然后Nginx可以“终止”加密连接,这意味着它将接受来自外部的加密连接,但随后使用常规的未加密连接与您的后端通信。这是一个非常有用的设置,因为它使您的应用程序不必处理证书和加密。Nginx的配置项如下:</p>
<pre><code>server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# ...
}
</code></pre>
<P>您需要考虑的另一个重要事项是如何处理通过常规HTTP连接的客户端将被处理。在我看来,最好的解决方案是通过重定向到相同的URL(但使用HTTPS)来响应未加密的请求。对于烧瓶应用,您可以使用烧瓶SSLify扩展来实现这一点。使用Nginx,您可以在配置中包括另一个服务器块:</p>
<pre><code>server {
listen 80;
server_name example.com;
location / {
return 301 https://$host$request_uri;
}
}
</code></pre>
<p>关于如何使用https设置应用程序的一个很好的教程可以在这里找到:<a href="https://blog.miguelgrinberg.com/post/running-your-flask-application-over-https" rel="nofollow noreferrer">Running Your Flask Application Over HTTPS</a></p>