Skip to content

Commit b2ef7b3

Browse files
committed
Make TLS mandatory for server
Add options to pass paths for certificate and private key to CLI Closes #2 Add test certificate FOR TESTS ONLY! Fix logger calls
1 parent 852af29 commit b2ef7b3

File tree

3 files changed

+88
-11
lines changed

3 files changed

+88
-11
lines changed

bin/saltyrtc-server

+16-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#!/usr/bin/env python3
22
"""
3-
The command line interface for the SaltyRTC Signalling Server.
3+
The command line interface for the SaltyRTC signalling server.
44
"""
55
import functools
66
import asyncio
@@ -38,16 +38,27 @@ def cli(ctx):
3838

3939

4040
@cli.command(short_help='Show version information.', help="""
41-
Show the current version of the SaltyRTC Signalling Server.
41+
Show the current version of the SaltyRTC signalling server.
4242
""")
4343
def version():
4444
click.echo('Version: {}'.format(_version))
4545

4646

47-
@cli.command()
47+
@cli.command(short_help='Start the signalling server.', help="""
48+
Start the SaltyRTC signalling server. CERT represents the path to a
49+
file in PEM format containing the SSL certificate of the server.""")
50+
@click.argument('cert', type=click.Path(exists=True))
51+
@click.option('-k', '--keyfile', type=click.Path(exists=True), help="""
52+
Path to a file that contains the private key. Will be read from
53+
CERTFILE if not present.
54+
""")
4855
@aio_serve
49-
def serve():
50-
yield from server.serve()
56+
def serve(**arguments):
57+
certfile = arguments.get('cert')
58+
keyfile = arguments.get('keyfile', None)
59+
yield from server.serve(
60+
certfile=certfile, keyfile=keyfile
61+
)
5162

5263

5364
if __name__ == '__main__':

saltyrtc/server/__init__.py

+25-6
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import json
55
import asyncio
66
import enum
7-
import logging
7+
import ssl
88

99
import websockets
1010

@@ -51,7 +51,7 @@ class Path(object):
5151

5252
def __init__(self):
5353
self.hash = hex(id(self))
54-
self.logger = logging.getLogger('signaling.{}'.format(self))
54+
self.logger = util.get_logger(self.hash)
5555
self.key = None
5656
self._client = asyncio.Future()
5757
self._server = asyncio.Future()
@@ -333,7 +333,7 @@ def signaling(ws, path):
333333
if len(path) != config.path_length:
334334
raise PathError(len(path))
335335
except PathError as exc:
336-
logging.getLogger('signaling').error(exc)
336+
util.get_logger().error(exc)
337337
return
338338

339339
# Create path instance (if necessary)
@@ -371,16 +371,35 @@ def signaling(ws, path):
371371

372372

373373
@asyncio.coroutine
374-
def serve(port=8765, loop=None):
374+
def serve(certfile, keyfile=None, host=None, port=8765, loop=None):
375375
"""
376-
TODO: Describe.
376+
Start serving SaltyRTC Signalling Clients.
377+
378+
Arguments:
379+
- `certfile`: Path to a file in PEM format containing the
380+
SSL certificate of the server.
381+
- `keyfile`: Path to a file that contains the private key.
382+
Will be read from `certfile` if not present.
383+
- `ssl`: An `ssl.SSLContext` instance for WSS.
384+
- `host`: The hostname or IP address the server will listen on.
385+
Defaults to all interfaces.
386+
- `port`: The port the client should connect to. Defaults to
387+
`8765`.
388+
- `loop`: A :class:`asyncio.BaseEventLoop` instance.
377389
"""
378390
# Get loop
379391
loop = loop if loop is not None else asyncio.get_event_loop()
392+
log.debug('Event loop: {}', loop)
393+
394+
# Create SSL context
395+
ssl_context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH)
396+
ssl_context.load_cert_chain(certfile=certfile, keyfile=keyfile)
397+
log.debug('Created SSL context', ssl_context)
380398

381399
# Start server
382400
log.debug('Starting server')
383-
server = yield from websockets.serve(signaling, port=port)
401+
server = yield from websockets.serve(
402+
signaling, ssl=ssl_context, host=host, port=port)
384403

385404
# Return server
386405
log.notice('Listening')

tests/cert.pem

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC4fXu6zFJIaSSV
3+
pvc39S6i+o54hZujW5zqo2A0YaXmB2RvmCwA8THJVIYaV02Y2DFs4gyFl0p/D/9e
4+
6dnl9PB7Mo23WRfkoM1/JtXs/FnUkEpSH97ssiOryoikP6urDzaPmMz0ydILM6xO
5+
A5p4oq4zYgBNN1f8JyYc8FQ2KsZEnTUg0cQxctq09chWxqT1scgc/5ELOfxIDPEk
6+
I7R9r3GUxZqVPwafljja/KdbBF+fNPiSJkI29d8zkRX7JvFATB/o8bxMbvIljBRa
7+
FFoHxRRkcmK7Cup1LqyeYRjldCL/q1tfXQ57BUv3w9UILrQdaraQiGwLt3m7OQRX
8+
Tz1VLxqDAgMBAAECggEAXK7Npf5XqAEKXBRRRk9qan4tbObSVbMElewVvLsBuRol
9+
ntp34NFLDbXk2P7bANo7mlPFrqdeyY6j4G7jBN+UoI+5Gk8r7bPLCQHdnvz3tA35
10+
CGDygT7NJNTO6JUEDR/LbUB6Vs+9Mdt3yImO5OP1V+L3+9K95PNV9lvWMpAyouzt
11+
Et5Tp1wPakGh6/OUXlyz51lZESSyvItP2/WOjUvgkSvdx/khM2If6ONGUtB2DK9y
12+
AhDhNImIHwdZaScZIC03UBvV3qSnXZ6Jc+aKzUK1Oq+pSXVG4LvLiEMYf0N68yed
13+
lRh3ar73JtD/Sels7oqlrZOHpqf8AqNCjC92Di8rIQKBgQDa0usmlfD4yrTCaDkq
14+
UkJWJlT3cnBTxsgq8yWpJv7MPmJ/LiC2pmDnz/Psyq2PPdNsL750bXFkWuEkwe7h
15+
UuJKUt2FeC5PIY3H5SX3CFKJEr3aPhz/H40EaKM3HTesJuqdZLaJ2b2C7vJotNVH
16+
HS45VpF0wyR0/rtAdmMxtXctFwKBgQDX1VLEwG11QgvuSDU1k7h0c4frCI3pj39W
17+
AysPc/gahXja/fCtPoI0v35ssw7uQqv8RwNpmMpkUwPqAQOLYGj/oDGXEgBVXhSz
18+
AxErM9erGDDZCIaogwz06Ccv7EiTqF6UJDfCl1ciiC3nZ4dnR0bAR8uxkStF1+XS
19+
r/usGNnZdQKBgQDHptd8TiQdqz0/fz5hGcqCtdiiKJzKIz0wysYazoR9r5HIvjqE
20+
y8rw1nCVJNs0LVHAjNM1gUGLMcvn8LXWifwDmhWZmGyQMGoe7zkzajl77UihXjiw
21+
oYXVdu8r8xF/lcZMMr7FiY/6ba9oz00k5D/veseeBAo4YM5SY3HfwdTpowKBgQDS
22+
g71RLqcUgbEFXuSXN1foLW9arWNNdasrh7eOQPyzUZAJeTowoBF7xXNYLmXXuqvp
23+
SpJngqGVrOraaNa+MPD4s5Tq1qIAodzqpYkvbEdlGBk89vXwkrImhfEC6yH283gc
24+
Yh8I63gPtGehlvcYowq9LMnejct5OhVtpDyDJVIGqQKBgQDPrw6+9QUDBxa4OUz+
25+
aW8raxe+aTPbFlP7N2fPcTwdPWvQkwhpWKpt6fKk+mSTNooIJt5dRif+JrafZ0Z/
26+
gXFiMnZ+ikv5NSHjd+KjxRshBuTWaDVGqOItFvPC2ipmfcB1KY1WXZZHm7x/myYR
27+
ATd3dFVClycKsjcz8e0OJaJXaA==
28+
-----END PRIVATE KEY-----
29+
-----BEGIN CERTIFICATE-----
30+
MIIDETCCAfmgAwIBAgIJAPV4ClYbVNscMA0GCSqGSIb3DQEBCwUAMB8xHTAbBgNV
31+
BAMMFHNhbHR5cnRjLnNlcnZlci50ZXN0MB4XDTE2MDIyNjIxMjYyNFoXDTE3MDIy
32+
NTIxMjYyNFowHzEdMBsGA1UEAwwUc2FsdHlydGMuc2VydmVyLnRlc3QwggEiMA0G
33+
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4fXu6zFJIaSSVpvc39S6i+o54hZuj
34+
W5zqo2A0YaXmB2RvmCwA8THJVIYaV02Y2DFs4gyFl0p/D/9e6dnl9PB7Mo23WRfk
35+
oM1/JtXs/FnUkEpSH97ssiOryoikP6urDzaPmMz0ydILM6xOA5p4oq4zYgBNN1f8
36+
JyYc8FQ2KsZEnTUg0cQxctq09chWxqT1scgc/5ELOfxIDPEkI7R9r3GUxZqVPwaf
37+
ljja/KdbBF+fNPiSJkI29d8zkRX7JvFATB/o8bxMbvIljBRaFFoHxRRkcmK7Cup1
38+
LqyeYRjldCL/q1tfXQ57BUv3w9UILrQdaraQiGwLt3m7OQRXTz1VLxqDAgMBAAGj
39+
UDBOMB0GA1UdDgQWBBSK1uqDP7pwmZoZnkYeyrOXQfIfaTAfBgNVHSMEGDAWgBSK
40+
1uqDP7pwmZoZnkYeyrOXQfIfaTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUA
41+
A4IBAQB4YPZB8n3or14BdL2Q2hYm5u2tb6lk9cgQFz7rX/HxnJeIjbDvw8vfeieO
42+
0fs0QRSJRp5wd39nvlSO6r7sbn94ZWHRm5A4lbaCy6efjyF+jMQTyeSJRr/Duz0x
43+
Vc/KgTO0j4GbagkdRDs0xa2o+TbPY/YYyv/qfkqBiVBqJxO9cZBhn7W/dv0U47F4
44+
+qhNDzpiIoQjeVpug8mHhZ6PIQRTtumv9F3gAeHuIxHTzZUo/zmAAUXhE1JzWwSg
45+
ajDWZx81f5q0zGH6oAdeFFFtLXOZNF+PYakjqstlsZewy+IEJJRFKH/Ca0Pnlvlw
46+
8MU82FTjv1HoQF56WClJWxdxi9ya
47+
-----END CERTIFICATE-----

0 commit comments

Comments
 (0)