Помогите правильно настроить telegrambotapi и webhook

столкнулся с такой проблемой. Раньше бот обращался к сайте для отправки и приема данных (post\get) запросы. После того как На сервере появился ssl сертификат. То бот стал выдавать ошибку. Погуглив я нашел способ где можно было у всех запросов прописать verify=False и вроде как все должно работать. Но при таком способе у меня не работали post запросы я начал искать дальше. Нашел что надо настраивать webhook. Но опыта в этом нет. Не только в этом но и работе с ssl сертификатом. Помогите разобраться, как настроить? Могу ли я настроить что бы запускать на локальной машине или надо обязательно запускать не сервере где сайт с которого берется инфа? сервер nginx

Я сделал следующим образом. Создал 3 файла: main - файл с кодом программы, webhook_cert.pem - где храниться ssl сертификат, Корневой сертификат, Промежуточный сертификат webhook_pkey.pem - где храниться приватный ключ

import telebot, logging, requests, json, time
from telebot import types
import dpath.util as dp
from string import ascii_letters
import cherrypy
import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
TOKEN_BOT = 'token' 

bot = telebot.TeleBot(TOKEN_BOT)

WEBHOOK_HOST = 'ip адрес сайта'
WEBHOOK_PORT = 443
WEBHOOK_LISTEN = 'ip адрес сайта' 

WEBHOOK_SSL_CERT = './webhook_cert.pem'  # Путь к сертификату
WEBHOOK_SSL_PRIV = './webhook_pkey.pem'  # Путь к приватному ключу

WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/%s/" % (TOKEN_BOT)

class WebhookServer(object):
    @cherrypy.expose
    def index(self):
        if 'content-length' in cherrypy.request.headers and \
                        'content-type' in cherrypy.request.headers and \
                        cherrypy.request.headers['content-type'] == 'application/json':
            length = int(cherrypy.request.headers['content-length'])
            json_string = cherrypy.request.body.read(length).decode("utf-8")
            update = telebot.types.Update.de_json(json_string)
            bot.process_new_updates([update])
            return ''
        else:
            raise cherrypy.HTTPError(403)

def main_menu(message):
    user_id = message.chat.id
    keyboard = types.InlineKeyboardMarkup(True)
    row = [types.InlineKeyboardButton(text="Пройти тест", callback_data=" ")]
    keyboard.row(*row)
    row = [types.InlineKeyboardButton(text="Личная информация", callback_data=" ")]
    keyboard.row(*row)
    row = [types.InlineKeyboardButton(text="Перейти на сайт", url="https://sitename.ru/home")]
    keyboard.row(*row)
    row = [types.InlineKeyboardButton(text="Выйти", callback_data=" ")]
    keyboard.row(*row)
    return keyboard

@bot.message_handler(commands=["start"])
def send_welcome(message):
    img = open("./logo.jpg", "rb")
    bot.send_photo(message.chat.id, img,
                   caption="Добро пожаловать",
                   reply_markup=main_menu(message))


bot.remove_webhook()
bot.set_webhook(url=WEBHOOK_URL_BASE + WEBHOOK_URL_PATH,
                certificate=open(WEBHOOK_SSL_CERT, 'r'))

cherrypy.config.update({
    'server.socket_host': WEBHOOK_LISTEN,
    'server.socket_port': WEBHOOK_PORT,
    'server.ssl_module': 'builtin',
    'server.ssl_certificate': WEBHOOK_SSL_CERT,
    'server.ssl_private_key': WEBHOOK_SSL_PRIV
})


cherrypy.quickstart(WebhookServer(), WEBHOOK_URL_PATH, {'/': {}})

все файлы загрузил на сервер и получил ошибку которая повторяется пока не остановлю сервер.

[25/Apr/2020:14:56:39] ENGINE Listening for SIGTERM.                                                                                  
[25/Apr/2020:14:56:39] ENGINE Listening for SIGHUP.                                                                                   
[25/Apr/2020:14:56:39] ENGINE Listening for SIGUSR1.                                                                                  
[25/Apr/2020:14:56:39] ENGINE Bus STARTING                                                                                            
[25/Apr/2020:14:56:39] ENGINE Started monitor thread 'Autoreloader'.                                                                  
[25/Apr/2020:14:56:40] ENGINE Serving on https://31.31.203.65:8443                                                                    
[25/Apr/2020:14:56:40] ENGINE Bus STARTED                                                                                             
[25/Apr/2020:14:56:40] ENGINE Error in HTTPServer.tick                                                                                
Traceback (most recent call last):                                                                                                    
  File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/server.py", line 1776, in serve                                     
    self.tick()                                                                                                                       
  File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/server.py", line 1999, in tick                                      
    conn = self.connections.get_conn(self.socket)                                                                                     
  File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/connections.py", line 180, in get_conn                              
    return self._from_server_socket(server_socket)                                                                                    
  File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/connections.py", line 199, in _from_server_socket                   
    s, ssl_env = self.server.ssl_adapter.wrap(s)                                                                                      
  File "/root/HoToStudy-env/lib64/python3.6/site-packages/cheroot/ssl/builtin.py", line 244, in wrap                                  
    sock, do_handshake_on_connect=True, server_side=True,                                                                             
  File "/usr/lib64/python3.6/ssl.py", line 365, in wrap_socket                                                                        
    _context=self, _session=session)                                                                                                  
  File "/usr/lib64/python3.6/ssl.py", line 773, in __init__                                                                           
    self.do_handshake()                                                                                                               
  File "/usr/lib64/python3.6/ssl.py", line 1033, in do_handshake                                                                      
    self._sslobj.do_handshake()                                                                                                       
  File "/usr/lib64/python3.6/ssl.py", line 645, in do_handshake                                                                       
    self._sslobj.do_handshake()                                                                                                       
ssl.SSLError: [SSL: SSLV3_ALERT_BAD_CERTIFICATE] sslv3 alert bad certificate (_ssl.c:877)    

Помогите разобраться, только пожалуйста помните что я в этом вообще не понимаю и если не сложно более детально объясните.


Ответы (1 шт):

Автор решения: D. Violet

Получение оповещения bad certificate означает, что сервер требует от вас аутентификации с помощью сертификата, а вы этого не сделали, и это вызвало сбой рукопожатия.

проверьте дату истечения сертификата (выполните данную команду в консоли сервера): openssl x509 -enddate -noout -in file.pem

еще смущает, что у вас в коде WEBHOOK_PORT = 443, а в консоли [25/Apr/2020:14:56:40] ENGINE Serving on https://31.31.203.65:8443 или у вас перенаправление?

так же вы можете попробовать использовать сертификаты выданные Let's Encrypt через certbot

→ Ссылка