blob: e0c159a26dea41dbe94b325ee4c9a20525429d17 [file] [log] [blame]
Jean-Paul Calderone7fb6b212011-06-06 08:31:28 -04001# Copyright (C) Jean-Paul Calderone
2# See LICENSE for details.
3
Jean-Paul Calderone7fb6b212011-06-06 08:31:28 -04004from sys import stdout
5from socket import SOL_SOCKET, SO_REUSEADDR, socket
6
7from OpenSSL.crypto import FILETYPE_PEM, load_privatekey, load_certificate
8from OpenSSL.SSL import TLSv1_METHOD, Context, Connection
9
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010010
Jean-Paul Calderone7fb6b212011-06-06 08:31:28 -040011def load(domain):
12 crt = open(domain + ".crt")
13 key = open(domain + ".key")
14 result = (
15 load_privatekey(FILETYPE_PEM, key.read()),
16 load_certificate(FILETYPE_PEM, crt.read()))
17 crt.close()
18 key.close()
19 return result
20
21
22def main():
23 """
24 Run an SNI-enabled server which selects between a few certificates in a
25 C{dict} based on the handshake request it receives from a client.
26 """
27 port = socket()
28 port.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
29 port.bind(('', 8443))
30 port.listen(3)
31
32 print 'Accepting...',
33 stdout.flush()
34 server, addr = port.accept()
35 print 'accepted', addr
36
37 server_context = Context(TLSv1_METHOD)
38 server_context.set_tlsext_servername_callback(pick_certificate)
39
40 server_ssl = Connection(server_context, server)
41 server_ssl.set_accept_state()
42 server_ssl.do_handshake()
43 server.close()
44
45
46certificates = {
47 "example.invalid": load("example.invalid"),
48 "another.invalid": load("another.invalid"),
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010049}
Jean-Paul Calderone7fb6b212011-06-06 08:31:28 -040050
51
52def pick_certificate(connection):
53 try:
54 key, cert = certificates[connection.get_servername()]
55 except KeyError:
56 pass
57 else:
58 new_context = Context(TLSv1_METHOD)
59 new_context.use_privatekey(key)
60 new_context.use_certificate(cert)
61 connection.set_context(new_context)
Hynek Schlawack8b7e4552016-03-13 07:51:09 +010062
63
64if __name__ == '__main__':
65 raise SystemExit(main())