1from datetime import datetime, timedelta 2from tempfile import mkdtemp 3 4from cryptography import x509 5from cryptography.hazmat.primitives import hashes, serialization 6from cryptography.hazmat.primitives.asymmetric import rsa 7from cryptography.x509.oid import NameOID 8 9 10temp_dir = mkdtemp() 11print(temp_dir) 12 13 14def genrsa(path): 15 key = rsa.generate_private_key( 16 public_exponent=65537, 17 key_size=2048, 18 ) 19 with open(path, "wb") as f: 20 f.write( 21 key.private_bytes( 22 encoding=serialization.Encoding.PEM, 23 format=serialization.PrivateFormat.TraditionalOpenSSL, 24 encryption_algorithm=serialization.NoEncryption(), 25 ) 26 ) 27 return key 28 29 30def create_cert(path, C, ST, L, O, key): 31 subject = issuer = x509.Name( 32 [ 33 x509.NameAttribute(NameOID.COUNTRY_NAME, C), 34 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, ST), 35 x509.NameAttribute(NameOID.LOCALITY_NAME, L), 36 x509.NameAttribute(NameOID.ORGANIZATION_NAME, O), 37 ] 38 ) 39 cert = ( 40 x509.CertificateBuilder() 41 .subject_name(subject) 42 .issuer_name(issuer) 43 .public_key(key.public_key()) 44 .serial_number(x509.random_serial_number()) 45 .not_valid_before(datetime.utcnow()) 46 .not_valid_after( 47 # Our certificate will be valid for 10 days 48 datetime.utcnow() 49 + timedelta(days=10) 50 ) 51 .add_extension( 52 x509.BasicConstraints(ca=True, path_length=None), 53 critical=True, 54 ) 55 .sign(key, hashes.SHA256()) 56 ) 57 # Write our certificate out to disk. 58 with open(path, "wb") as f: 59 f.write(cert.public_bytes(serialization.Encoding.PEM)) 60 return cert 61 62 63def create_req(path, C, ST, L, O, key): 64 csr = ( 65 x509.CertificateSigningRequestBuilder() 66 .subject_name( 67 x509.Name( 68 [ 69 # Provide various details about who we are. 70 x509.NameAttribute(NameOID.COUNTRY_NAME, C), 71 x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, ST), 72 x509.NameAttribute(NameOID.LOCALITY_NAME, L), 73 x509.NameAttribute(NameOID.ORGANIZATION_NAME, O), 74 ] 75 ) 76 ) 77 .sign(key, hashes.SHA256()) 78 ) 79 with open(path, "wb") as f: 80 f.write(csr.public_bytes(serialization.Encoding.PEM)) 81 return csr 82 83 84def sign_certificate_request(path, csr_cert, ca_cert, private_ca_key): 85 cert = ( 86 x509.CertificateBuilder() 87 .subject_name(csr_cert.subject) 88 .issuer_name(ca_cert.subject) 89 .public_key(csr_cert.public_key()) 90 .serial_number(x509.random_serial_number()) 91 .not_valid_before(datetime.utcnow()) 92 .not_valid_after( 93 # Our certificate will be valid for 10 days 94 datetime.utcnow() 95 + timedelta(days=10) 96 # Sign our certificate with our private key 97 ) 98 .sign(private_ca_key, hashes.SHA256()) 99 ) 100 with open(path, "wb") as f: 101 f.write(cert.public_bytes(serialization.Encoding.PEM)) 102 return cert 103 104 105ca_key = genrsa(temp_dir + "/ca.key") 106ca_cert = create_cert( 107 temp_dir + "/ca.pem", 108 "US", 109 "New York", 110 "New York", 111 "Gloo Certificate Authority", 112 ca_key, 113) 114 115pkey = genrsa(temp_dir + "/pkey.key") 116csr = create_req( 117 temp_dir + "/csr.csr", 118 "US", 119 "California", 120 "San Francisco", 121 "Gloo Testing Company", 122 pkey, 123) 124 125cert = sign_certificate_request(temp_dir + "/cert.pem", csr, ca_cert, ca_key) 126