电报机器人 SSL 错误:SSL 错误 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify fa
Posted
技术标签:
【中文标题】电报机器人 SSL 错误:SSL 错误 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed【英文标题】:telegram bot SSL error: SSL error error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed电报机器人 SSL 错误:SSL 错误 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed 【发布时间】:2018-08-24 19:30:02 【问题描述】:我使用让我们加密免费 SSL(我的主机提供商默认支持它),
我在 sslshopper.com 上查看了我的网站(唯一的警告是:The certificate is not trusted in all web browsers. You may need to install an Intermediate/chain certificate to link it to a trusted root certificate. Learn more about this error. The fastest way to fix this problem is to contact your SSL provider.
)和https://www.geocerts.com/ssl_checker
结果是我的网站通过了所有测试,Certificate Chain Complete
除外。所以我不认为问题出在证书上,据我所知,电报接受自签名证书。
我尝试在https://core.telegram.org/bots/samples/hellobot 使用电报示例机器人, 设置 webhook URL 后,我在 https://api.telegram.org/bot[my-token]/getWebhookinfo 上检查了我的机器人
结果是:
"ok": true,
"result":
"url": "https://itest.gigfa.com/tlg1/tlg1.php",
"has_custom_certificate": false,
"pending_update_count": 17,
"last_error_date": 1521140994,
"last_error_message": "SSL error 337047686, error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed",
"max_connections": 40
机器人根本无法工作。
【问题讨论】:
【参考方案1】:我的 k8s 设置遇到了同样的问题,我使用 cert-manager 颁发自签名证书,但由于某种原因它不起作用,这是我解决这个问题的方法:
1- 使用此命令颁发证书:
openssl req -newkey rsa:2048 -sha256 -nodes -keyout PRIVATE.key -x509 -days 365 -out PUBLIC.pem -subj "/C=NG/ST=Lagos/L=Lagos/O=YOUR_ORG_NAME_HERE/CN=PUT_YOUR_DOMAIN_HERE"
注意:用您的信息填写 YOUR_ORG_NAME_HERE 和 PUT_YOUR_DOMAIN_HERE。
2-base64 对两个文件进行编码以存储在 k8s 中。
3- 编辑证书结束将它们放置到位:
kubectl edit secret [secret-name] -n [namespace]
注意:把PUBLIC.pem的base64内容放到ca.crt
和tls.crt
,把PRIVATE.key的base64放到tls.key
。
【讨论】:
【参考方案2】:在我的情况下,我有自己的 https 服务器在 node.js 中运行,解决方案是将从我的 SSL 提供程序获得的 .pem 文件添加到 https 服务器的凭据中,这里的代码:
// modules
const fs = require('fs')
const express = require('express')
const https = require('https')
// read files
const cert = fs.readFileSync('./ssl/cert.crt')
const key = fs.readFileSync('./ssl/key.key')
const ca = fs.readFileSync('./ssl/ca.pem')
// set in an object (you must respect the field names)
const credentials = key, cert, ca
// https server
const apiApp = express()
// ... your middlewares
const apiAppHttps = https.createServer(credentials, apiApp)
// telegram only supports ports 443, 80, 88, 8443
apiAppHttps.listen(8443, () =>
console.log(`API listen ar port 8443`)
)
请注意,电报 webhook 仅接受端口 443、80、88、8443,您可以在此处获取更多信息:
https://core.telegram.org/bots/faq#im-having-problems-with-webhooks
【讨论】:
【参考方案3】:对于那些使用 webmin 和 Let's Encrypt 的人,我在 5 小时后的解决方案:
下载以下链接 lets-encrypt-r3-cross-signed
转到服务器 -> Apache Webserver -> 你的虚拟主机
在里面将下载的文件设置到“证书颁发机构文件”框中:
看来ssl检查流程一定要改一下。
【讨论】:
【参考方案4】:是的,问题出在您的证书上。
您的 getWebHookInfo 中的错误:
"last_error_message":"SSL error 337047686, error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed"
Telegram 是否说它需要整个证书链(也称为 CA Bundle 或全链证书)。
如何检查您的证书:
您可以使用 SSL Labs SSL Server Test 服务来检查您的证书:
只需像以下示例一样传递您的 URL,将 valde.ci 替换为您的主机:
https://www.ssllabs.com/ssltest/analyze.html?d=valde.ci&hideResults=on&latest
如果您看到“链问题:不完整”,则表示您没有提供完整的链式证书。
如何解决:
为您的 SSL 证书提供商下载完整的链式证书并将其安装在您的网络服务器上。
我不知道您使用的是哪种服务,但对于我的示例,使用 gunicorn 我解决了添加 ca-certs 和我的 SSL 证书提供商(在我的情况下为 Namecheap Comodo)发送的 ca-bundle
文件我的 SSL 配置,如下例:
ca_certs = "cert/my-service.ca-bundle"
欲了解更多信息:@martini 对此thread 和FIX: Telegram Webhooks Not Working 帖子的回答。
【讨论】:
我在共享主机上使用让我们加密免费 SSL。这个问题是我们加密还是我的主机提供商的问题? 您是否添加了所有三个需要的文件(.key、.crt 和 .ca-bundle)?如果是这样,您需要在站点配置中添加所有内容。 Namecheap 有一个很好的文档,介绍了如何以多种不同方式在您的站点中安装 ssl 证书,例如 Apache、Node.js、nginx 等。请检查您是否可以遵循其中一种可用方式:namecheap.com/support/knowledgebase/article.aspx/795/69/… 谢谢,问题是我没有设置 CA 证书。 大家好,有没有人能帮我解决类似的问题? ***.com/questions/62325866/…以上是关于电报机器人 SSL 错误:SSL 错误 error:1416F086:SSL routines:tls_process_server_certificate:certificate verify fa的主要内容,如果未能解决你的问题,请参考以下文章
为啥出现ERR_SSL_PROTOCOL_ERROR 错误啊?
IIS SSL 错误“ssl_error_rx_record_too_long”
在服务器端获取 SSL 错误 SSL_ERROR_RX_RECORD_TOO_LONG