LINUX.ORG.RU

HTTPS (with ssl) сервер на Python

 , ,


0

1

День добрый. Есть вот такой самописный веб-сервер на питоне:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import SimpleHTTPServer, BaseHTTPServer, ssl, cgi
from bootstrap import Bootstrap
from GatewayResponse.GatewayResponseService import GatewayResponseService


class ServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def do_GET(self):
        return

    def do_POST(self):
        post = {}

        if 'Content-Type' in self.headers:
            form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={
                    'REQUEST_METHOD': 'POST',
                    'CONTENT_TYPE': self.headers['Content-Type'],
                }
            )

            for item in form.list:
                post[item.name] = item.value

        self.bootstrap(post)
        return

    def bootstrap(self, data):
        b = Bootstrap(data)
        b.start()
        response = GatewayResponseService(b.response, 'json')
        b.end()

        self.send_response(200)
        self.send_header('content-type', response.getContentType())
        self.end_headers()
        self.wfile.write(response.getPackedAnswer())

httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), ServerHandler)
httpd.serve_forever()

Всё работает отлично. НО! Как сделать из него HTTPS? Полазив по интернетам, наткнулся на много туториалов. Но все они сводятся к использованию подобной строчки перед httpd.server_forever()

httpd.socket = ssl.wrap_socket(httpd.socket,
                               server_side=True,
                               certfile='./cert.crt')
httpd.serve_forever()

Такой сервер запускается, но не реагирует ни на какие запросы. Более того, даже если ему указать несуществующий путь на сертификат, то он и словом не обмолвится.

Может сможете помочь и подсказать, в чём может быть дело?

P.S. Python 2.7.8

★★★

Поставь нжинкс и проксируй

Goury ★★★★★ ()

Я рекомендую фронтендом поставить nginx, а бэкендом какой-нить микрофреймворк типа bootle.py или flask какой-нить. Вот эти все do_POST и ручной парсинг запросов выглядят порнографией. Завтра тебе понадобятся шаблоны куки и будет месиво.

Но если тебе надо ssl то вот вторая ссылка в гугле: https://www.piware.de/2011/01/creating-an-https-server-in-python/

true_admin ★★★★★ ()
Ответ на: комментарий от true_admin

Пардон, невнимательно читал. Проверь питон хотябы через strace. У меня ругается:

>>> httpd.socket = ssl.wrap_socket (httpd.socket, certfile='path/to/localhost.pem', server_side=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ssl.py", line 891, in wrap_socket
    ciphers=ciphers)
  File "/usr/lib/python2.7/ssl.py", line 509, in __init__
    self._context.load_cert_chain(certfile, keyfile)
IOError: [Errno 2] No such file or directory

UP: попробуй закомментировать bootstrap и GatewayResponse в импортах. Может, они как-то не дружат с ssl.

true_admin ★★★★★ ()
Последнее исправление: true_admin (всего исправлений: 1)
Ответ на: комментарий от VirRaa

Всегда раз помочь советом в хорошем деле.
А теперь надо отметить топик решённым.

Goury ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.