【问题标题】: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
  }
}

机器人根本无法工作。

【问题讨论】:

    标签: php ssl bots telegram


    【解决方案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.crttls.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 对此threadFIX: Telegram Webhooks Not Working 帖子的回答。

          【讨论】:

          • 我在共享主机上使用让我们加密免费 SSL。这个问题是我们加密还是我的主机提供商的问题?
          • 您是否添加了所有三个需要的文件(.key、.crt 和 .ca-bundle)?如果是这样,您需要在站点配置中添加所有内容。 Namecheap 有一个很好的文档,介绍了如何以多种不同方式在您的站点中安装 ssl 证书,例如 Apache、Node.js、Nginx 等。请检查您是否可以遵循其中一种可用方式:namecheap.com/support/knowledgebase/article.aspx/795/69/…
          • 谢谢,问题是我没有设置 CA 证书。
          • 大家好,有没有人能帮我解决类似的问题? stackoverflow.com/questions/62325866/…
          猜你喜欢
          • 1970-01-01
          • 2018-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多