Добрых суток.
Есть небольшой многопоточный сервер на питоне, которому нужно обслуживать 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)
Есть ли способ заставить работать такую конструкцию?
Заранее спасибо.



