Certificate generation utilities#
The certificate generation utilities provide a convenient way to generate self-signed certificates suitable for testing gRPC applications with mutual TLS authentication. These utilities are particularly useful for pytest fixtures and local development environments.
Important
These certificates are for testing purposes only. Do not use them in production environments. For production deployments, always use certificates from a trusted Certificate Authority. For guidance on how to generate certificates for local development, see the Securing gRPC connections documentation.
Note
By default, generated certificates are valid for only 24 hours. This short
validity period is intentional for testing environments to encourage
certificate regeneration and avoid stale credentials. You can customize
this using the validity_days parameter if needed.
Installation#
Install Ansys Common Tools with the other optional dependency group to
enable certificate generation:
pip install ansys-tools-common[other]
uv sync --extra other
Quick start#
The simplest way to generate certificates is using the
generate_test_certificates()
function:
from ansys.tools.common.utils import generate_test_certificates
from pathlib import Path
# Generate certificates for localhost
files = generate_test_certificates(output_dir=Path("certs"))
# The following files are created:
# - ca.key, ca.crt (Certificate Authority)
# - server.key, server.crt (Server certificate)
# - client.key, client.crt (Client certificate)
Pytest integration#
The utilities are designed to integrate seamlessly with pytest fixtures, making it easy to set up secure testing environments:
Basic fixture#
import pytest
from pathlib import Path
from ansys.tools.common.utils import generate_test_certificates
@pytest.fixture(scope="session")
def tls_certificates(tmp_path_factory):
"""Generate TLS certificates for testing."""
cert_dir = tmp_path_factory.mktemp("certs")
generate_test_certificates(output_dir=cert_dir)
return {
"ca_cert": cert_dir / "ca.crt",
"ca_key": cert_dir / "ca.key",
"server_cert": cert_dir / "server.crt",
"server_key": cert_dir / "server.key",
"client_cert": cert_dir / "client.crt",
"client_key": cert_dir / "client.key",
}
def test_grpc_with_mtls(tls_certificates):
"""Test gRPC server with mutual TLS."""
# Use the certificates in your test
server_cert = tls_certificates["server_cert"]
server_key = tls_certificates["server_key"]
ca_cert = tls_certificates["ca_cert"]
# Set up your gRPC server with these certificates
# ...
Advanced usage#
HPC deployment with multiple servers#
For HPC environments where you need certificates for multiple nodes:
from ansys.tools.common.utils import generate_test_certificates
from pathlib import Path
files = generate_test_certificates(
servers=[
"node01,192.0.2.1", # Primary hostname + IP SAN
"node02,192.0.2.2",
"node03,192.0.2.3",
],
output_dir=Path("hpc_certs"),
)
# This creates:
# - ca.key, ca.crt
# - node01.key, node01.crt (with SAN: 192.0.2.1)
# - node02.key, node02.crt (with SAN: 192.0.2.2)
# - node03.key, node03.crt (with SAN: 192.0.2.3)
# - client.key, client.crt
HPC fixture example#
import pytest
from pathlib import Path
from ansys.tools.common.utils import generate_test_certificates
@pytest.fixture(scope="session")
def hpc_tls_certificates(tmp_path_factory):
"""Generate TLS certificates for HPC deployment."""
cert_dir = tmp_path_factory.mktemp("hpc_certs")
server_specs = [
"node01,192.0.2.1",
"node02,192.0.2.2",
"node03,192.0.2.3",
]
generate_test_certificates(servers=server_specs, output_dir=cert_dir)
result = {
"ca_cert": cert_dir / "ca.crt",
"ca_key": cert_dir / "ca.key",
"client_cert": cert_dir / "client.crt",
"client_key": cert_dir / "client.key",
"cert_dir": cert_dir,
"servers": {},
}
# Add server-specific certificates
for spec in server_specs:
server_name = spec.split(",")[0]
result["servers"][server_name] = {
"cert": cert_dir / f"{server_name}.crt",
"key": cert_dir / f"{server_name}.key",
}
return result
Custom validity period#
By default, certificates are valid for 24 hours (1 day). This short validity period is intentional for testing to ensure certificates are regenerated frequently. You can customize this if needed:
from ansys.tools.common.utils import generate_test_certificates
from pathlib import Path
# Generate certificates valid for 3 days
files = generate_test_certificates(output_dir=Path("certs"), validity_days=3)
Using the CertificateGenerator class#
For more control over certificate generation, use the
CertificateGenerator
class directly:
from ansys.tools.common.utils import CertificateGenerator
from pathlib import Path
# Initialize generator with custom parameters
generator = CertificateGenerator(key_size=4096, validity_days=3)
# Generate CA certificate
ca_key, ca_cert = generator.create_ca_certificate("My Test CA")
# Generate server certificate with SANs
server_key, server_cert = generator.create_server_certificate(
ca_cert, ca_key, "myserver.local", san_names=["192.168.1.100", "myserver"]
)
# Generate client certificate
client_key, client_cert = generator.create_client_certificate(
ca_cert, ca_key, "Test Client"
)
# Save certificates
output_dir = Path("custom_certs")
output_dir.mkdir(exist_ok=True)
generator.save_private_key(server_key, output_dir / "server.key")
generator.save_certificate(server_cert, output_dir / "server.crt")
# ... save other certificates
Security considerations#
The generated certificates have the following characteristics:
Self-signed: Not validated by any certificate authority
Predictable parameters: Generated with standard key sizes and algorithms
No revocation support: No certificate revocation lists (CRLs) or OCSP
Testing only: Intended only for local development and testing
For production deployments:
Use certificates from a trusted Certificate Authority (CA)
Implement proper certificate rotation and expiration policies
Use hardware security modules (HSMs) for key management when appropriate
Follow your organization’s security policies and compliance requirements
Use cases#
Common use cases for these certificate utilities include:
Unit and integration tests: Set up secure gRPC connections in test suites
Local development: Test TLS-enabled features without external dependencies
CI/CD pipelines: Generate ephemeral certificates for test environments
HPC testing: Simulate multi-node secure communication
Documentation examples: Provide working security examples without sharing real credentials