AWS KMS backed CertService for Swarmauri
Project description
swarmauri_certservice_aws_kms
AWS KMS backed certificate service for Swarmauri.
This package provides an implementation of CertServiceBase that signs and verifies X.509 certificates using AWS Key Management Service.
Features
- Create CSRs from exportable key material.
- Issue certificates using AWS KMS
SignAPI. - Create self‑signed certificates.
- Verify and parse certificates with RFC 5280 compliance.
Prerequisites
- Python 3.10 or newer.
- AWS account with KMS keys that allow the
Signoperation (RSAorECC_NIST_P256). AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY(or an IAM role/instance profile) grantingkms:GetPublicKeyandkms:Signpermissions.boto3installed (automatically pulled in via this package) and network access to the target AWS region.- For certificate signing: an issuer subject template and optional CA certificate bytes to embed in verification metadata.
Extras
docs: documentation helpers.perf: benchmarking support.
Installation
# pip
pip install swarmauri_certservice_aws_kms
# poetry
poetry add swarmauri_certservice_aws_kms
# uv (pyproject-based projects)
uv add swarmauri_certservice_aws_kms
Testing
Run unit, functional and performance tests in isolation from the repository root:
uv run --package swarmauri_certservice_aws_kms --directory community/swarmauri_certservice_aws_kms pytest
Quickstart: Issue a Certificate with AWS KMS
The snippet below signs an incoming CSR using a customer-managed KMS key. Attach the key ARN to the KeyRef via kid or tags (aws_kms_key_id).
import asyncio
from datetime import datetime, timedelta, timezone
from pathlib import Path
from swarmauri_certservice_aws_kms import AwsKmsCertService
from swarmauri_core.crypto.types import KeyRef
async def main() -> None:
service = AwsKmsCertService(region_name="us-east-1")
csr_bytes = Path("tenant.csr").read_bytes()
ca_cert = Path("ca.pem").read_bytes()
kms_key = KeyRef(kid="arn:aws:kms:us-east-1:123456789012:key/abcd-1234")
certificate_pem = await service.sign_cert(
csr=csr_bytes,
ca_key=kms_key,
issuer={"CN": "Example KMS Issuing CA", "O": "Example Corp"},
ca_cert=ca_cert,
not_after=int((datetime.now(timezone.utc) + timedelta(days=365)).timestamp()),
)
Path("tenant.pem").write_bytes(certificate_pem)
print("Issued certificate saved to tenant.pem")
if __name__ == "__main__":
asyncio.run(main())
Generating CSRs and Self-Signed Roots
AwsKmsCertService can build CSRs from exportable key material and mint a self-signed certificate using the same KMS key.
import asyncio
from datetime import datetime, timedelta, timezone
from pathlib import Path
from swarmauri_certservice_aws_kms import AwsKmsCertService
from swarmauri_core.crypto.types import KeyRef
async def bootstrap_ca() -> None:
service = AwsKmsCertService(region_name="us-east-1")
# Generate CSR from a local private key
key_ref = KeyRef(material=Path("intermediate-key.pem").read_bytes())
csr_pem = await service.create_csr(
key=key_ref,
subject={"CN": "Example Intermediate CA", "O": "Example Corp"},
san={"dns": ["intermediate.example.com"]},
)
Path("intermediate.csr").write_bytes(csr_pem)
# Issue a self-signed root using a KMS key
kms_key = KeyRef(kid="arn:aws:kms:us-east-1:123456789012:key/root-ca-key")
root_pem = await service.create_self_signed(
key=kms_key,
subject={"CN": "Example Root CA", "O": "Example Corp"},
not_after=int((datetime.now(timezone.utc) + timedelta(days=3650)).timestamp()),
)
Path("root-ca.pem").write_bytes(root_pem)
if __name__ == "__main__":
asyncio.run(bootstrap_ca())
Best Practices
- Grant the KMS key limited permissions:
kms:GetPublicKey,kms:DescribeKey,kms:Sign. Avoid broad grants (e.g., wildcard actions). - Store KMS key ARNs in
KeyRef.tags["aws_kms_key_id"]orKeyRef.kidfor clarity and to avoid hard-coding ARNs throughout application logic. - Coordinate certificate validity with KMS key rotation—renew certificates before rotating customer-managed keys.
- Cache returned certificates and metadata to minimize repeated calls to KMS and reduce signing latency.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swarmauri_certservice_aws_kms-0.3.3.dev3.tar.gz.
File metadata
- Download URL: swarmauri_certservice_aws_kms-0.3.3.dev3.tar.gz
- Upload date:
- Size: 14.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94fcd995e0df348a1831f2a911213e2906c2c6da2f733428bb364e8216e734ff
|
|
| MD5 |
0db3fb5620b8acd027d47598e194e46d
|
|
| BLAKE2b-256 |
c3735dca88b5d53641984f04bf29a27710cf9711e075d55639b147eb34c5a9f9
|
File details
Details for the file swarmauri_certservice_aws_kms-0.3.3.dev3-py3-none-any.whl.
File metadata
- Download URL: swarmauri_certservice_aws_kms-0.3.3.dev3-py3-none-any.whl
- Upload date:
- Size: 14.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.3 {"installer":{"name":"uv","version":"0.10.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
866021ea374cbe3a936fba9bcb86114e9791dc0d93d4c93c681b4f3895463a88
|
|
| MD5 |
fbceb8eff19f3461f055d524c55592df
|
|
| BLAKE2b-256 |
d38bfe28d2c70f69452a5dad4f6b9034d2b426bf7816eab89ef7325ea984446c
|