我使用let的加密免费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
}
}
并且机器人根本不起作用。
答案 0 :(得分:3)
是的,问题出在您的证书上。
您的getWebHookInfo中的错误:
"last_error_message":"SSL error {337047686, error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed}"
电报是说它需要整个证书链(也称为CA Bundle或全链证书)。
您可以使用SSL Labs SSL Server Test服务来检查您的证书:
只需像以下示例一样传递您的网址,将coderade.github.io
替换为主机:
https://www.ssllabs.com/ssltest/analyze.html?d=coderade.github.io&hideResults=on&latest
如果看到“链问:未完成” ,则表示您没有提供完整的链式证书。
为您的SSL证书提供商下载完整的链式证书,并将其安装在您的网络服务器上。
我不知道您使用的是哪种服务,但是以gunicorn为例,我解决了将SSL证书提供者发送的ca-certs与ca-bundle
文件一起添加的问题(对于我来说Namecheap Comodo)在我的SSL配置上,例如以下示例:
ca_certs = "cert/my-service.ca-bundle"
有关更多信息:@martini对此thread和FIX: Telegram Webhooks Not Working帖子的回答。
答案 1 :(得分:0)
对于那些使用 webmin 和 Let's Encrypt 的人,我 5 小时后的解决方案:
下载以下链接 lets-encrypt-r3-cross-signed
转到服务器 -> Apache Webserver -> 你的虚拟主机
里面有设置下载的文件到“证书权限文件”框中:
看来ssl检查流程肯定有变化。
答案 2 :(得分:0)
就我而言,我有自己的 https 服务器在 node.js 中运行,解决方案是在 https 服务器的凭据中添加从我的 SSL 提供程序获取的 .pem 文件,代码如下:
// 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`)
})
请注意,telegram webhook 只接受端口 443、80、88、8443,您可以在此处获取更多信息:
https://core.telegram.org/bots/faq#im-having-problems-with-webhooks