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.
Pingback: Setting up an HTTPS (SSL) Server using CherryPy | Brownian Hacking