77 lines
2.3 KiB
Python
77 lines
2.3 KiB
Python
"""
|
|
Generate self-signed SSL certificate for testing HTTPS webhooks
|
|
Run this script to create cert.pem and key.pem files
|
|
"""
|
|
|
|
import subprocess
|
|
import sys
|
|
import os
|
|
|
|
|
|
def generate_certificate():
|
|
"""Generate self-signed certificate using OpenSSL"""
|
|
|
|
cert_file = "cert.pem"
|
|
key_file = "key.pem"
|
|
|
|
# Check if OpenSSL is available
|
|
try:
|
|
subprocess.run(["openssl", "version"], capture_output=True, check=True)
|
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
|
print("ERROR: OpenSSL not found!")
|
|
print("\nFor Windows, you can:")
|
|
print(
|
|
"1. Install OpenSSL from: https://slproweb.com/products/Win32OpenSSL.html"
|
|
)
|
|
print("2. Or use Git Bash which includes OpenSSL")
|
|
print("3. Or use WSL (Windows Subsystem for Linux)")
|
|
return False
|
|
|
|
print("Generating self-signed certificate...")
|
|
print("This will create cert.pem and key.pem files")
|
|
print()
|
|
|
|
# Generate certificate valid for 365 days
|
|
cmd = [
|
|
"openssl",
|
|
"req",
|
|
"-x509",
|
|
"-newkey",
|
|
"rsa:4096",
|
|
"-keyout",
|
|
key_file,
|
|
"-out",
|
|
cert_file,
|
|
"-days",
|
|
"365",
|
|
"-nodes", # No passphrase
|
|
"-subj",
|
|
"/C=US/ST=State/L=City/O=Organization/CN=localhost",
|
|
]
|
|
|
|
try:
|
|
subprocess.run(cmd, check=True)
|
|
print(f"\n✓ Certificate created: {os.path.abspath(cert_file)}")
|
|
print(f"✓ Private key created: {os.path.abspath(key_file)}")
|
|
print("\nYou can now run the server with HTTPS:")
|
|
print(
|
|
f" python src/test_server.py --ssl-cert {cert_file} --ssl-key {key_file} --hook-port 8443"
|
|
)
|
|
print("\nOr webhook-only HTTPS:")
|
|
print(
|
|
f" python src/test_server.py --ssl-cert {cert_file} --ssl-key {key_file} --hook-port 8443 --hook-ssl-only"
|
|
)
|
|
print(
|
|
"\nNote: Self-signed certificates will show security warnings in browsers."
|
|
)
|
|
print("For production, use certificates from a trusted CA like Let's Encrypt.")
|
|
return True
|
|
except subprocess.CalledProcessError as e:
|
|
print(f"ERROR: Failed to generate certificate: {e}")
|
|
return False
|
|
|
|
|
|
if __name__ == "__main__":
|
|
if not generate_certificate():
|
|
sys.exit(1)
|