Форум сайта python.su
Привет пишу сюда в последнюю очередь, перепробовал уже все что можно. Проблема при подключении вебхука к моему серверу в консоли появляется ошибка “TLSV1_ALERT_UNKNOWN_CA] tlsv1 alert unknown ca”,
ругается на корневой сертификат и естественно запрос не доходит на сервер. Думал что сертификат делаю не так хотя пример был взят из оф документации.
Взял бота на Go запустил его с этими сертификатами и все заработало. Скорее всего ошибка в питоновских библиотеках для ssl, поделитесь мыслями кто что думает ?
Офлайн
Jeck290Есть такая мысль, что ошибка у тебя в коде какая-то. Раз ты его не привёл, значит не понимаешь, что код приводить надо. А если не понимаешь, что код приводить надо, значит не очень шаришь в программировании. ;)
поделитесь мыслями кто что думает ?
Отредактировано py.user.next (Март 11, 2016 00:56:47)
Офлайн
Jeck290:) Это знакомая гипотеза. Думаю отношение вероятности нахождения ошибки в стандартных библиотеках по сравнению с ошибкой в своем новом коде для опытного разработчика порядка 1/1000. Я не имею ввиду конечно начальную фазу когда код пишется и свои ошибки идут валом. Имею ввиду на фазе эксплуатации кода.
Скорее всего ошибка в питоновских библиотеках для ssl, поделитесь мыслями кто что думает ?
Офлайн
Да нет с программированием у меня все хорошо ) ну или я так думаю
вот код он в скриншотах, могу конечно архив скинуть но там нужно то всего подключить сертификаты к вебсерверу тобиш включить ssl. Я пробую сделать это на tornado,
настройки подключения сертификата в tornado
обработчик post запроса, если приходит пост то в консоли должен быть принт
урлы
ну и код для включения вебхука, посылаем урл и сам сертификат, все как написано в офф документации
Сервер находится на raspberry pi , dns в данном случае идет от сервисов микротика. По сути нужно настроить ssl на веб сервере и сделать обработчик для post запроса, когда ты активируешь вебхук то и пишешь боту то на сервер начинают приходить post запросы но в логах появляется ошибка ((( Точно такой же бот только для go таких ошибок с сертификатом не имеет, просто мне интресно почему ssl выдает ошибку, поискал в гугле решение проблемы но так и ничего не нашел ….
Офлайн
Jeck290Конечно надо скидывать архив. Ты же не в курсе, что скинутый код ещё и запускается обычно, чтобы ошибку воспроизвести. Да и чтобы просто процитировать кусок из этого кода, никто не будет сидеть и набирать его. Потому и выводы такие, что не очень-то ты с кодом много работаешь, раз таких вещей не знаешь.
вот код он в скриншотах, могу конечно архив скинуть
Офлайн
# -*- coding: utf-8 -*- from tornado.ioloop import IOLoop from tornado.web import RequestHandler, Application from tornado.httpserver import HTTPServer class MainHandler(RequestHandler): def get(self): print "GET" self.write("GET") def post(self, *args, **kwargs): print "POST" self.write('POST') application = Application([ (r"/", MainHandler), ]) http_server = HTTPServer(application, ssl_options={'certfile': 'webhook_cert.pem', 'keyfile': 'webhook_pkey.pem'}) if __name__ == "__main__": http_server.listen(8443, address='0.0.0.0') IOLoop.instance().start()
def set_webhook(): data = {'url': 'https://DOMENNAME:8443/', 'certificate': open('key/webhook_cert.pem', 'r')} r = requests.post('https://api.telegram.org/bot(TOKEN)/setWebhook',data = data) print r.text
Офлайн
GO bot
если берем этого бота(echo) и подсовываем сертификаты все сразу работает и ошибок не выдает…
Офлайн
Напиши везде полные, абсолютные пути к сертификатам. Сами сертификаты на время положи в папку, доступную для всех приложений (например /tmp).
Jeck290Во всех таких местах полные пути к файлам должны стоять.http_server = HTTPServer(application, ssl_options={'certfile': 'webhook_cert.pem', 'keyfile': 'webhook_pkey.pem'})
Отредактировано py.user.next (Март 12, 2016 04:32:55)
Офлайн
Я смотрел код сервера там были строки существуют ли ключ и сертификат по указанному пути если нет то ошибка. Попробовал как ты сказал, абсолютные пути + общедоступные папки например /tmp , неа все тоже самое (((
Офлайн
По этой документации попробуй.
Там нужно создать контекст, заполнить его и передать.
ssl_ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) ssl_ctx.load_cert_chain(os.path.join(data_dir, "mydomain.crt"), os.path.join(data_dir, "mydomain.key")) HTTPServer(applicaton, ssl_options=ssl_ctx)
Офлайн