51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
from pathlib import Path
|
|
import argparse
|
|
from OpenSSL import crypto
|
|
import sys
|
|
|
|
def generate_certificate(cert_name: str, output_dir: Path, cn: str = "localhost", days: int = 365):
|
|
k = crypto.PKey()
|
|
k.generate_key(crypto.TYPE_RSA, 2048)
|
|
|
|
cert = crypto.X509()
|
|
cert.get_subject().CN = cn
|
|
cert.set_serial_number(1000)
|
|
cert.gmtime_adj_notBefore(0)
|
|
cert.gmtime_adj_notAfter(days*24*60*60)
|
|
cert.set_issuer(cert.get_subject())
|
|
cert.set_pubkey(k)
|
|
cert.sign(k, 'sha256')
|
|
|
|
output_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
with open(output_dir / f"{cert_name}_cert.pem", "wb") as f:
|
|
f.write(crypto.dump_certificate(crypto.FILETYPE_PEM, cert))
|
|
with open(output_dir / f"{cert_name}_key.pem", "wb") as f:
|
|
f.write(crypto.dump_privatekey(crypto.FILETYPE_PEM, k))
|
|
|
|
def main():
|
|
print("Certificate Generator")
|
|
print("-" * 20)
|
|
|
|
# Get default paths
|
|
default_path = Path(__file__).parent / "certificates"
|
|
|
|
# Get user input with defaults
|
|
cert_name = input(f"Certificate name (default: test_cert): ") or "test_cert"
|
|
cn = input(f"Common Name (default: localhost): ") or "localhost"
|
|
days = input(f"Valid days (default: 365): ") or "365"
|
|
output_dir = input(f"Output directory (default: {default_path}): ") or str(default_path)
|
|
|
|
try:
|
|
days = int(days)
|
|
output_path = Path(output_dir)
|
|
generate_certificate(cert_name, output_path, cn, days)
|
|
print(f"\nSuccess! Certificate files created:")
|
|
print(f"- {output_path / f'{cert_name}_cert.pem'}")
|
|
print(f"- {output_path / f'{cert_name}_key.pem'}")
|
|
except Exception as e:
|
|
print(f"\nError: {str(e)}")
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main() |