It took me more time than it should have to piece together the right bits of current information for using SSL with cherrypy. Here’s a fully working example of cherrypy 3.2.0 serving up HTTPS requests.
Quick notes – if you haven’t tried cherrypy, do it. It’s awesome in its simplicity. Also, I got my SSL cert from godaddy, which was the cheapest I found. This particular cert uses a certificate chain, so when all is said and done we have my_cert.crt, my_cert.key, and gd_bundle.crt.
ssl_server.py:
import cherrypy class RootServer: @cherrypy.expose def index(self, **keywords): return "it works!" if __name__ == '__main__': server_config={ 'server.socket_host': '0.0.0.0', 'server.socket_port':443, 'server.ssl_module':'pyopenssl', 'server.ssl_certificate':'/home/ubuntu/my_cert.crt', 'server.ssl_private_key':'/home/ubuntu/my_cert.key', 'server.ssl_certificate_chain':'/home/ubuntu/gd_bundle.crt' } cherrypy.config.update(server_config) cherrypy.quickstart(RootServer())
Launch the server like:
sudo python ssl_server.py
You need to use sudo because it runs on port 443. You should be asked to “Enter PEM pass phrase” that you set when generating your key.
Update: In a follow-up post I show how you run an HTTPS server (port 443) and an HTTP server (port 80) at the same time.