Skip to content

Instantly share code, notes, and snippets.

@DannyHinshaw
Forked from guyo13/simple-https-server.py
Last active April 8, 2024 04:16
Show Gist options
  • Star 43 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save DannyHinshaw/a3ac5991d66a2fe6d97a569c6cdac534 to your computer and use it in GitHub Desktop.
Save DannyHinshaw/a3ac5991d66a2fe6d97a569c6cdac534 to your computer and use it in GitHub Desktop.
# taken from http://www.piware.de/2011/01/creating-an-https-server-in-python/
# generate server.pem with the following command:
# openssl req -new -x509 -keyout key.pem -out server.pem -days 365 -nodes
# run as follows:
# python simple-https-server.py
# then in your browser, visit:
# https://localhost:4443
import http.server
import ssl
server_address = ('localhost', 4443)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
server_side=True,
certfile="server.pem",
keyfile="key.pem",
ssl_version=ssl.PROTOCOL_TLS)
httpd.serve_forever()
@MarkLeMerise
Copy link

@DannyHinshaw
Copy link
Author

Updated, thanks!

@dustinfreeman
Copy link

This server works when visiting the https server on my desktop, but I can't visit it from Android or iOS devices on the same network. Is this expected behaviour?

@DannyHinshaw
Copy link
Author

@dustinfreeman yes that is expected, you would need to do more to connect externally to a server running on your desktop via another device. Have you tried something like this? https://stackoverflow.com/a/4779992/5750392

@dustinfreeman
Copy link

dustinfreeman commented Jun 7, 2019

@DannyHinshaw Yes, my phone is on the same network, and I’m trying to connect to <my computer’s IP>:4443

With the same setup, I’ve been able to connect my mobile devices to my machine with the built-in http server, ie.
python -m http.server 4443

I wonder if there’s a problem with the cert? Both my phones treated the site as if it didn’t exist instead of throwing any warning.

@DannyHinshaw
Copy link
Author

That's strange, I'm really not sure why that's happening, I haven't used it in that way yet.

@sandsjd
Copy link

sandsjd commented Jun 10, 2019

So I am new to Python and real computer languages and techniques. What is meant in the comment by generate an XML with "open...-nodes"?
I understand that I need to run the python code in cmd, but what does the XML file do and what is it supposed to look like? i ran the basic http code before using:
python -m http.server
but i didnt realize that it had to be a secure server for what I needed.

@pinkas
Copy link

pinkas commented Aug 2, 2019

Works fine when trying to access it from the same computer it's running from but when trying to access it from another device it does not work for me. I just replace localhost with the local ip address. Any idea ?

@evandrix
Copy link

server.xml server.pem

@johnthagen
Copy link

To serve on all interfaces (so other devices on the network can connect):

server_address = ('', 4443)

@ingnelson
Copy link

How to add a response : HTTP/1.1 200 Connection established\r\n\r\n when someone send a http request with CONNECT method ???

Copy link

ghost commented Nov 23, 2022

Hello!
This program works great with keys 2046 bit, but when i use key size 256 bit, program sends erroq.
Unfortionatly i need to use this size (256) can you help me to resolvw it please?
Снимок экрана 2022-11-23 в 23 25 40

@candlerb
Copy link

There have been some more deprecations. New version without deprecation warnings (in python 3.10 anyway) looks like this:

import http.server
import ssl

server_address = ('', 4443)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
ctx = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_SERVER)
ctx.load_cert_chain(certfile="server.pem", keyfile="key.pem")
httpd.socket = ctx.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever()

@xNul
Copy link

xNul commented Apr 8, 2024

None of these worked for me, but twistd -no web --path=. --https=443 -c cert.pem -k key.pem did. Can be installed via pip install twisted. I was able to use a Let's Encrypt certificate generated by certbot so it can be used across the internet.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment