The Error
Traceback (most recent call last): File "/Users/fenghexu/OneDrive - zju.edu.cn/Documents/ZJU/Courses/2019 Fall & Winter/blogdiy/demo/auto_deploy_docker/web_socket.py", line 37, in <module> ssl_context.load_cert_chain(localhost_pem) ssl.SSLError: [SSL] PEM lib (_ssl.c:3824)
Python Secure Web Socket Source Code
That’s where the localhost.pem required.
import asyncio import json import logging import websockets import ssl import pathlib logging.basicConfig() USERS = set() async def register(websocket): USERS.add(websocket) # await notify_users() async def unregister(websocket): USERS.remove(websocket) async def deploy_service(websocket, path): await register(websocket) try: # await websocket.send() async for message in websocket: data = json.loads(message) print(data) await websocket.send('data received') finally: await unregister(websocket) ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER) localhost_pem = pathlib.Path(__file__).with_name("localhost.pem") ssl_context.load_cert_chain(localhost_pem) start_server = websockets.serve(deploy_service, '0.0.0.0', 6789, ssl=ssl_context) asyncio.get_event_loop().run_until_complete(start_server) asyncio.get_event_loop().run_forever()
Solution
I changed the way that I generate the localhost.pem file
Original
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout key.pem -out cert.pem $ cp key.pem localhost.pem
Current
$ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.pem -out localhost.pem
Now the 2 files are combined together.
The solution to a Real Application
But this does not work when I try to connect to wss server from a https webpage client. In this case, the solution is to use a certbot, as I have illustrated here: