Добрых суток.
Есть небольшой многопоточный сервер на питоне, которому нужно обслуживать ssl подключения. Для определения имени хоста и выбора подходящего сертификата, используется SNI в TLS. Для этого использую set_servername_callback, для задания функции в которой происходит обработка имени сервера.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import time
import socket
import threading
import ssl
class client(threading.Thread):
def __init__(self, sock, host, port):
threading.Thread.__init__(self)
self.daemon = True
self.srvname = None
self.sock = sock
self.host = host
self.port = port
self.context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
self.context.set_servername_callback(self.sni)
def sni(self, sock, sni, context):
self.srvname = sni
if self.srvname:
self.context.load_cert_chain(certfile = self.srvname + '.crt', keyfile = self.srvname + '.key')
else:
self.context.load_cert_chain(certfile = 'server.crt', keyfile = 'server.key')
print "SNI: ", sni
def run(self):
try:
sslsock = self.context.wrap_socket(self.sock, server_side=True)
sslsock.settimeout(5)
...тут что-то делаем...
except socket.error as msg:
print "Exception in client thread: " + str(msg)
class server(threading.Thread):
def __init__(self, host, port):
threading.Thread.__init__(self)
self.daemon = True
self.port = port
self.host = host
self.clients = []
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
def run(self):
self.sock.bind((self.host, self.port))
self.sock.listen(5)
while True:
sock, addr = self.sock.accept()
clnt = client(sock, addr[0], addr[1])
clnt.start()
self.clients.append(clnt)
if __name__ == '__main__':
srv = server('127.0.0.1', 9999)
srv.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
print "\rGoodbye!"
sys.exit()
Но как бы я не менял код получаю такое:
SNI: SNI: server.local.ru
server.local.ru
Exception in client thread: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:590)
Exception in client thread: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:590)
SNI: server.local.ru
Exception in client thread: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:590)
Exception in client thread: [SSL: INAPPROPRIATE_FALLBACK] inappropriate fallback (_ssl.c:590)
SNI: server.local.ru
Exception in client thread: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:590)
SNI: server.local.ru
Exception in client thread: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:590)
Exception in client thread: [SSL: INAPPROPRIATE_FALLBACK] inappropriate fallback (_ssl.c:590)
Есть ли способ заставить работать такую конструкцию?
Заранее спасибо.