【问题标题】:telegram bot webhook self-signed certificate problemtelegram bot webhook 自签名证书问题
【发布时间】:2021-04-11 21:48:42
【问题描述】:

我有一个静态 IP 地址,我想将其用作 Telegram bot webhook。换句话说,我的机器人应用程序在我的本地系统上运行,我将调制解调器配置为将来自该 IP 地址的请求转发到我的本地服务器:端口。此方法适用于在我的本地系统上运行的其他应用程序,但 ssl 有问题。

为了设置webhook,首先我用这种方式生成一个自签名证书

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_NAME_OR_COMPANY_NAME/CN=<MY_IP:PORT> OR <MY_IP>"

这会生成PUBLIC.pem 文件,我将它发送到setWebhook api。结果还可以,但我总是从getWebhookInfo 方法得到以下结果:

{
   "ok":true,
   "result":{
      "url":".../bot/receive",
      "has_custom_certificate": true,
      "pending_update_count":15,
      "last_error_date":1609911454,
      "last_error_message":"SSL error {error:14095044:SSL routines:ssl3_read_n:internal error}",
      "max_connections":40,
      "ip_address":"..."
   }
}

同样在我的应用程序中,我启用了具有 .p12 等效于 .pem 证书的 ssl 支持,但无法正常工作。有没有办法做到这一点?提前致谢。

【问题讨论】:

  • CN=<MY_IP:PORT> OR <MY_IP> 你真的在两者之间指定了OR 吗?我不相信这是有效的。如果您想要多个,则需要将它们添加为备用。见stackoverflow.com/a/23587047/2232127

标签: ssl telegram telegram-bot


【解决方案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_NAME_OR_COMPANY_NAME/CN=<MY_IP:PORT> OR <MY_IP>"

...更具体地说是-subj 开关。当然,您提供的是 CSR 信息,但如果仔细观察,您在声明 IP 时使用的是or 运算符。此外,您最后的初始化只是普通的 IP 地址。为了进一步了解如何创建自签名 SSL 证书,我建议您使用以下资源:

对于一个 DNS 名称,您的证书应如下所示:

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_NAME_OR_COMPANY_NAME/CN=<MY_IP:PORT>

MY_IP 显然是您自己的服务器的 IP 地址(您从中调用 webhook)。

为了完整起见,我建议您使用反向代理,例如 NGNIX - 它可以让您免去许多关于请求容器中 SSL 证书的麻烦。如果你问我,一旦建立起来就更容易维护。 虽然这只是一个替代选项。

【讨论】:

  • @hamed 如果我能够彻底回答您的问题,请告诉我。如果有不清楚的地方,请随时向我询问有关此回复的任何问题!
【解决方案2】:

几天前我遇到了这个问题,我知道正确的解决方案。 首先,它是openssl的正确命令。

openssl req -newkey rsa:2048 -sha256 -nodes -keyout PRIVATE.key -x509 -days 365 -out PUBLIC.pem -subj "/C=US/ST=State/L=City/O=pinkyhi/CN=IP"

确保您只输入 IP WITHOUT“https://”前缀或端口。 接下来,您需要使用此命令将您的 PUBLIC.pem 转换为 .pfx 格式并为其设置密码。

openssl pkcs12 -inkey PRIVATE.key -in PUBLIC.pem -export -out PUBLIC.pfx

现在您应该编辑 Program.cs 文件并检查是否存在:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
            webBuilder.UseKestrel(options =>
            {
                options.ConfigureHttpsDefaults(co =>
                {
                    co.SslProtocols = SslProtocols.Tls12;
                });
                options.Listen(IPAddress.Loopback, 443, listenOptions =>
                {
                    listenOptions.UseHttps("./Static/PUBLIC.pfx", "YOURPASSWORD");
                });
                options.Listen(IPAddress.Any, 443, listenOptions =>
                {
                    listenOptions.UseHttps("./Static/PUBLIC.pfx", "YOURPASSWORD");
                });
            });
        });

接下来检查您发送到 Telegram 的 webhook URL 格式是否为:“https://IP”,以及 WITHOUT 端口!

如果所有这些都没有帮助您,请尝试使用此 HTML 表单手动上传带有 URL 的 webHook,您也可以查看 webhook 信息以获取有关错误的一些信息。您应该根据自己的 TOKEN 进行编辑。

<html>
<body>

<form action="https://api.telegram.org/botTOKEN/setwebhook" method="post" enctype="multipart/form-data">
    Select Certificate to upload:
    <input type="file" name="certificate" id="fileToUpload">
    URL: <input type="text" name="url"  value="https://IP"><br>
    <input type="submit" value="Upload Certificate" name="submit">
</form>
<br>
<br>
<br>
<a href="https://api.telegram.org/botTOKEN/getWebhookInfo">Check hook info</a>
</body>
</html>

并检查您是否在防火墙和路由器上打开了 443 端口

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 2016-03-12
    • 2018-07-20
    • 2016-10-19
    • 1970-01-01
    • 2016-11-28
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多