Skip to content

Instantly share code, notes, and snippets.

@dergachev
Created October 17, 2013 17:07
Show Gist options
  • Save dergachev/7028596 to your computer and use it in GitHub Desktop.
Save dergachev/7028596 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.xml with the following command:
# openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes
# run as follows:
# python simple-https-server.py
# then in your browser, visit:
# https://localhost:4443
import BaseHTTPServer, SimpleHTTPServer
import ssl
httpd = BaseHTTPServer.HTTPServer(('localhost', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='./server.pem', server_side=True)
httpd.serve_forever()
@Alexufo
Copy link

Alexufo commented Oct 29, 2021

I did update for python 3.10 + (ssl.wrap_socket() is deprecated)

https://gist.github.com/Alexufo/2303bff77f0a16ba83568f0260b8cf47

@fqqf
Copy link

fqqf commented Jan 10, 2022

Awesome!

@kashmax
Copy link

kashmax commented Apr 13, 2022

Hi,
Can anyone comment about the usage of this honeyhttpd?
Thank you

@OriKovacsiKatz
Copy link

hi @Honghe and @jcPOLO used this snippet of https on local host - there is an error message:
Can't open C:\Program Files\Common Files\ssl/openssl.cnf for reading, No such file or directoryCan't open C:\Program Files\Common Files\ssl/openssl.cnf for reading, No such file or directory

how can I generate this cnf file correctly?
thanks
Ori

@ciscohack
Copy link


Can you help me how to make this work?

#!/usr/bin/python
from BaseHTTPServer import BaseHTTPRequestHandler,HTTPServer
import ssl
import sys

PORT_NUMBER = int(sys.argv[1])

#This class will handles any incoming request from
#the browser 
class myHandler(BaseHTTPRequestHandler):
	#Handler for the GET requests
	def do_GET(self):
		print(self.requestline)
		#print(self.rfile.read(content_length))
		self.send_response(200)
		self.send_header('Content-type','text/html')
		self.end_headers()
		# Send the html message
		self.wfile.write("Hello World !".encode())
		return

try:
	#Create a web server and define the handler to manage the
	#incoming request
	server = HTTPServer(('', PORT_NUMBER), myHandler)
	server.socket = ssl.wrap_socket(server.socket, certfile='cert.pem',keyfile='key.pem',  server_side=True)
	print 'Started httpserver on port ' , PORT_NUMBER
	
	#Wait forever for incoming htto requests
	server.serve_forever()

except KeyboardInterrupt:
	print '^C received, shutting down the web server'
	server.socket.close()

When I run it and load it from the browser... It's only loading and never displaying the "Hello Word!" text. But it'll only show when I ctrl+c the server whilst loading. Can anyone tell me what's the solution for this?

openssl req -new -x509 -keyout key.pem -out server.pem -days 365 -nodes

#!/usr/bin/python
import http.server
import ssl
import sys

# Open SSL Certificate
# openssl req -new -x509 -keyout key.pem -out server.pem -days 365 -nodes

PORT_NUMBER = int(sys.argv[1])

# This class will handles any incoming request from
# the browser


class myHandler(http.server.SimpleHTTPRequestHandler):
    # Handler for the GET requests
    def do_GET(self):
        print(self.requestline)
        # print(self.rfile.read(content_length))
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()
        # Send the html message
        self.wfile.write("Hello World !".encode())
        return


try:
    # Create a web server and define the handler to manage the
    # incoming request
    server = http.server.HTTPServer(('', PORT_NUMBER), myHandler)
    server.socket = ssl.wrap_socket(server.socket, certfile='cert.pem', keyfile='key.pem', server_side=True)
    print('Started httpserver on port ', PORT_NUMBER)

    # Wait forever for incoming htto requests
    server.serve_forever()

except KeyboardInterrupt:
    print('^C received, shutting down the web server')
    server.socket.close()

@Dragorn421
Copy link

Updated to Python 3.11.4 (http.server module changes, ssl module changes/deprecations)

from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
from pathlib import Path

port = 4443

httpd = HTTPServer(("localhost", port), SimpleHTTPRequestHandler)
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
ssl_context.load_cert_chain(Path(__file__).parent / "server.pem")
httpd.socket = ssl_context.wrap_socket(
    httpd.socket,
    server_side=True,
)

print(f"Serving on https://localhost:{port}")
httpd.serve_forever()

@stephenlb
Copy link

Nice!

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