diff --git a/localca_project/LocalCA/ca.py b/localca_project/LocalCA/ca.py
index 6a1064b..1fed09b 100644
--- a/localca_project/LocalCA/ca.py
+++ b/localca_project/LocalCA/ca.py
@@ -5,9 +5,10 @@
import logging
import ipaddress
-from datetime import datetime, timedelta
+from datetime import datetime, timedelta, timezone
+
from cryptography import x509
-from cryptography.x509.oid import NameOID
+from cryptography.x509.oid import ExtendedKeyUsageOID, NameOID
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes, serialization
from cryptography.hazmat.backends import default_backend
@@ -33,7 +34,7 @@ def __init__(self):
key_cert_sign=True,
crl_sign=True,
encipher_only=False,
- decipher_only=False)
+ decipher_only=False,)
def generate_private_key(self):
"""
@@ -83,9 +84,9 @@ def create_root_certificate(
).serial_number(
x509.random_serial_number()
).not_valid_before(
- datetime.utcnow()
+ datetime.now(timezone.utc)
).not_valid_after(
- datetime.utcnow() + timedelta(days=validity_days)
+ datetime.now(timezone.utc) + timedelta(days=validity_days)
).add_extension(
# Subject Key Identifier for this certificate
ski,
@@ -149,6 +150,8 @@ def create_leaf_certificate(
common_name: str,
san_list: list,
validity_days: int,
+ server_auth: bool,
+ client_auth: bool,
intermediate_public_key: str,
intermediate_private_key: str) -> dict:
"""
@@ -166,6 +169,8 @@ def create_leaf_certificate(
cert = self.sign_leaf_csr(
csr,
validity_days,
+ server_auth,
+ client_auth,
intermediate_cert,
intermediate_private_key)
@@ -278,9 +283,9 @@ def sign_csr(
).serial_number(
x509.random_serial_number()
).not_valid_before(
- datetime.utcnow()
+ datetime.now(timezone.utc)
).not_valid_after(
- datetime.utcnow() + timedelta(days=validity_days)
+ datetime.now(timezone.utc) + timedelta(days=validity_days)
).add_extension(
# Subject Key Identifier for the issued certificate
ski,
@@ -306,6 +311,8 @@ def sign_leaf_csr(
self,
csr: x509.CertificateSigningRequest,
validity_days: int,
+ server_auth: bool,
+ client_auth: bool,
ca_cert: x509.Certificate,
ca_private_key: str) -> x509.Certificate:
"""
@@ -328,9 +335,9 @@ def sign_leaf_csr(
).serial_number(
x509.random_serial_number()
).not_valid_before(
- datetime.utcnow()
+ datetime.now(timezone.utc)
).not_valid_after(
- datetime.utcnow() + timedelta(days=validity_days)
+ datetime.now(timezone.utc) + timedelta(days=validity_days)
)
# Add SAN extension if present in the CSR
@@ -360,6 +367,20 @@ def sign_leaf_csr(
path_length=None),
critical=True)
+ # Add server and client auth extensions if present
+ extended_key_usage = []
+ if server_auth:
+ extended_key_usage.append(x509.ExtendedKeyUsageOID.SERVER_AUTH)
+
+ if client_auth:
+ extended_key_usage.append(x509.ExtendedKeyUsageOID.CLIENT_AUTH)
+
+ if len(extended_key_usage) > 0:
+ builder = builder.add_extension(
+ x509.ExtendedKeyUsage(extended_key_usage),
+ critical=False
+ )
+
return builder.sign(
ca_private_key_obj,
hashes.SHA256(),
diff --git a/localca_project/LocalCA/templates/LocalCA/create_leaf.html b/localca_project/LocalCA/templates/LocalCA/create_leaf.html
index 2e9943c..fc1d2be 100644
--- a/localca_project/LocalCA/templates/LocalCA/create_leaf.html
+++ b/localca_project/LocalCA/templates/LocalCA/create_leaf.html
@@ -78,6 +78,20 @@
Create Leaf Certificate
Number of days the certificate will be valid (max 825 days)
+
+
+
+
+
Server Auth
+
+
Client Auth
+
Can be used to limit possible uses. Increasingly required by browsers and services.
+
+