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()
@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!

@ak64th
Copy link

ak64th commented May 7, 2024

Do you guys get it work on 443 port? It works on any other port on my laptop but 443. Though nmap and netstat -tulpn show the port is open, curl and openssl s_client always say connection refused.

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