-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenerate_ca.py
More file actions
66 lines (56 loc) · 2.03 KB
/
generate_ca.py
File metadata and controls
66 lines (56 loc) · 2.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.serialization import Encoding, PrivateFormat, NoEncryption
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives.hashes import SHA256
import sys
import datetime
script_name = sys.argv[0]
if len(sys.argv) != 2:
print("Usage: {} <common_name> <org_name> <town_name> <state_name> <country_initials>".format(script_name))
sys.exit(1)
common_name = sys.argv[1]
org_name = sys.argv[2]
town_name = sys.argv[3]
state_name = sys.argv[4]
country_initials = sys.argv[5]
ca_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
ca_name = x509.Name([
x509.NameAttribute(NameOID.COUNTRY_NAME, country_initials),
x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, state_name),
x509.NameAttribute(NameOID.LOCALITY_NAME, town_name),
x509.NameAttribute(NameOID.ORGANIZATION_NAME, org_name),
x509.NameAttribute(NameOID.COMMON_NAME, common_name),
])
ca_cert = x509.CertificateBuilder().subject_name(
ca_name
).issuer_name(
ca_name
).public_key(
ca_key.public_key()
).serial_number(
x509.random_serial_number()
).not_valid_before(
datetime.datetime.utcnow()
).not_valid_after(
datetime.datetime.utcnow() + datetime.timedelta(days=365)
).add_extension(
x509.BasicConstraints(ca=True, path_length=None),
critical=True,
).sign(
private_key=ca_key,
algorithm=hashes.SHA256(),
)
with open("ca_cert.pem", "wb") as f:
f.write(ca_cert.public_bytes(Encoding.PEM))
with open("ca_key.pem", "wb") as f:
f.write(ca_key.private_bytes(Encoding.PEM, PrivateFormat.PKCS8, NoEncryption()))
with open("ca_cert.crt", "wb") as f:
f.write(ca_cert.public_bytes(Encoding.PEM))
print("CA certificate and key generated.")