-
-
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() |
Updated, thanks!
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?
@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
@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.
That's strange, I'm really not sure why that's happening, I haven't used it in that way yet.
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.
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 ?
server.xml server.pem
To serve on all interfaces (so other devices on the network can connect):
server_address = ('', 4443)
How to add a response : HTTP/1.1 200 Connection established\r\n\r\n when someone send a http request with CONNECT method ???
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()
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.
As a slight update, the Python docs recommend using the version-agnostic
ssl.PROTOCOL_TLS
flag now.