电报机器人SSL错误:SSL错误{错误:1416F086:SSL例程:tls_process_server_certificate:证书验证失败}

时间:2018-03-15 20:36:28

标签: php ssl bots telegram

我使用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 } }

并且机器人根本不起作用。

3 个答案:

答案 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-certsca-bundle文件一起添加的问题(对于我来说Namecheap Comodo)在我的SSL配置上,例如以下示例:

ca_certs = "cert/my-service.ca-bundle"

有关更多信息:@martini对此threadFIX: Telegram Webhooks Not Working帖子的回答。

答案 1 :(得分:0)

对于那些使用 webmin 和 Let's Encrypt 的人,我 5 小时后的解决方案:

下载以下链接 lets-encrypt-r3-cross-signed

转到服务器 -> Apache Webserver -> 你的虚拟主机

ssl issue 1

里面有设置下载的文件到“证书权限文件”框中:

ssl issue 2

看来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