Coverage for jbank/management/commands/make_x509.py : 0%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1import logging
2from datetime import datetime, timedelta
3from cryptography import x509
4from cryptography.hazmat.backends import default_backend
5from cryptography.hazmat.primitives import serialization, hashes
6from cryptography.hazmat.primitives.asymmetric import rsa
7from django.core.management.base import CommandParser
8from jutil.command import SafeCommand
11logger = logging.getLogger(__name__)
14class Command(SafeCommand):
15 help = """
16 Generates RSA private key and x509 certificate in .pem format (for testing)
17 """
19 def add_arguments(self, parser: CommandParser):
20 parser.add_argument('--key-file', type=str, default='key.pem')
21 parser.add_argument('--cert-file', type=str, default='cert.pem')
22 parser.add_argument('--country', type=str, default='US')
23 parser.add_argument('--state', type=str, default='TX')
24 parser.add_argument('--locality', type=str, default='Dallas')
25 parser.add_argument('--org-name', type=str, default='Kajala Group')
26 parser.add_argument('--common-name', type=str, default='kajala.com')
28 def do(self, *args, **options):
29 # Generate our key
30 key = rsa.generate_private_key(
31 public_exponent=65537,
32 key_size=2048,
33 backend=default_backend()
34 )
36 # Write to disk unencrypted
37 with open(options['key_file'], "wb") as f:
38 f.write(key.private_bytes(
39 encoding=serialization.Encoding.PEM,
40 format=serialization.PrivateFormat.TraditionalOpenSSL,
41 encryption_algorithm=serialization.NoEncryption(),
42 ))
43 print('{} written'.format(f.name))
45 # Various details about who we are. For a self-signed certificate the
46 # subject and issuer are always the same.
47 subject = issuer = x509.Name([
48 x509.NameAttribute(x509.NameOID.COUNTRY_NAME, options['country']),
49 x509.NameAttribute(x509.NameOID.STATE_OR_PROVINCE_NAME, options['state']),
50 x509.NameAttribute(x509.NameOID.LOCALITY_NAME, options['locality']),
51 x509.NameAttribute(x509.NameOID.ORGANIZATION_NAME, options['org_name']),
52 x509.NameAttribute(x509.NameOID.COMMON_NAME, options['common_name']),
53 ])
54 cert = x509.CertificateBuilder().subject_name(
55 subject
56 ).issuer_name(
57 issuer
58 ).public_key(
59 key.public_key()
60 ).serial_number(
61 x509.random_serial_number()
62 ).not_valid_before(
63 datetime.utcnow()
64 ).not_valid_after(
65 # Our certificate will be valid for 10 days
66 datetime.utcnow() + timedelta(days=10)
67 ).add_extension(
68 x509.SubjectAlternativeName([x509.DNSName("localhost")]),
69 critical=False,
70 ).sign(key, hashes.SHA256(), default_backend())
72 # Write our certificate out to disk.
73 with open(options['cert_file'], "wb") as f:
74 f.write(cert.public_bytes(serialization.Encoding.PEM))
75 print('{} written'.format(f.name))