Back to Blog
Technical

TLS Certificate Management: Best Practices for Enterprise Security

A comprehensive guide to TLS certificate lifecycle management, including automation strategies, monitoring, and avoiding common pitfalls that lead to outages.

Mamone TarshaMamone Tarsha
April 15, 2025
9 min read

The Hidden Cost of Certificate Mismanagement

Certificate-related outages cost enterprises millions of dollars annually. In 2020, Microsoft Teams went down for hours due to an expired certificate. Similar incidents have affected Spotify, LinkedIn, and countless other organizations. Yet certificate management remains an afterthought for many security teams.

This guide covers the essential practices for managing TLS certificates at scale, from initial deployment to renewal automation.

Understanding the Certificate Lifecycle

The Four Phases

Every TLS certificate goes through four distinct phases:

1. Generation

  • Private key creation
  • Certificate Signing Request (CSR) generation
  • CA validation and issuance

2. Deployment

  • Installation on servers and load balancers
  • Configuration of cipher suites and protocols
  • Testing and validation

3. Monitoring

  • Expiration tracking
  • Revocation status checking
  • Security posture assessment

4. Renewal

  • Automated or manual renewal
  • Key rotation decisions
  • Seamless deployment of new certificates

Certificate Types and Use Cases

Domain Validated (DV)

DV certificates verify domain ownership only. They're suitable for:

  • Personal websites and blogs
  • Internal development environments
  • Non-commercial applications

Issuance time: Minutes Cost: Free to low ($10-50/year) Trust indicators: Padlock icon only

Organization Validated (OV)

OV certificates verify the organization's identity:

  • Business websites
  • Customer-facing applications
  • API endpoints

Issuance time: 1-3 days Cost: $50-200/year Trust indicators: Organization name in certificate details

Extended Validation (EV)

EV certificates require rigorous verification:

  • Financial services
  • E-commerce platforms
  • Government applications

Issuance time: 1-2 weeks Cost: $200-1000/year Trust indicators: Organization name prominently displayed (browser-dependent)

Automation with ACME

The Automatic Certificate Management Environment (ACME) protocol revolutionized certificate management. Here's how to implement it effectively:

Using Certbot

# Install certbot
apt install certbot python3-certbot-nginx

# Obtain certificate with automatic renewal
certbot --nginx -d example.com -d www.example.com

# Verify automatic renewal
certbot renew --dry-run

Programmatic ACME with Rust

use acme_client::{Account, Directory, OrderStatus};

async fn obtain_certificate(domain: &str) -> Result<Certificate> {
    // Connect to Let's Encrypt
    let directory = Directory::from_url(
        "https://acme-v02.api.letsencrypt.org/directory"
    ).await?;

    // Create or load account
    let account = Account::create(&directory, &account_key).await?;

    // Create order for domain
    let order = account.new_order(&[domain]).await?;

    // Complete HTTP-01 challenge
    for auth in order.authorizations().await? {
        let challenge = auth.http_challenge()?;
        deploy_challenge_response(&challenge).await?;
        challenge.validate().await?;
    }

    // Finalize with CSR
    let cert = order.finalize(&csr).await?;
    Ok(cert)
}

Monitoring Best Practices

What to Monitor

MetricAlert ThresholdAction
Days until expiry< 30 daysWarning
Days until expiry< 7 daysCritical
Certificate chain validityAny breakCritical
OCSP/CRL statusRevokedCritical
Key size< 2048 bits RSAWarning
Signature algorithmSHA-1Critical

Building a Monitoring System

import ssl
import socket
from datetime import datetime, timedelta

def check_certificate(hostname: str, port: int = 443) -> dict:
    context = ssl.create_default_context()

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            cert = ssock.getpeercert()

    # Parse expiration
    not_after = datetime.strptime(
        cert['notAfter'],
        '%b %d %H:%M:%S %Y %Z'
    )
    days_remaining = (not_after - datetime.utcnow()).days

    return {
        'hostname': hostname,
        'issuer': dict(cert['issuer'][0])['organizationName'],
        'expires': not_after.isoformat(),
        'days_remaining': days_remaining,
        'subject_alt_names': [
            x[1] for x in cert.get('subjectAltName', [])
        ]
    }

Common Pitfalls and Solutions

1. Certificate Chain Issues

Problem: Server sends leaf certificate without intermediates.

Solution: Always configure the full chain:

ssl_certificate /etc/ssl/certs/fullchain.pem;
ssl_certificate_key /etc/ssl/private/key.pem;

2. Hostname Mismatches

Problem: Certificate doesn't cover all required hostnames.

Solution: Use Subject Alternative Names (SANs):

DNS:example.com
DNS:www.example.com
DNS:api.example.com
DNS:*.staging.example.com

3. Key Rotation Neglect

Problem: Same private key used across multiple renewals.

Solution: Generate new keys periodically:

# Generate new key during renewal
certbot renew --reuse-key  # Don't do this forever
certbot renew              # Generates new key by default

4. Mixed Content After Migration

Problem: HTTP resources loaded on HTTPS pages.

Solution: Use Content Security Policy:

Content-Security-Policy: upgrade-insecure-requests

Enterprise-Scale Management

Certificate Inventory

Maintain a centralized inventory of all certificates:

FieldDescription
Common NamePrimary domain
SANsAll covered domains
IssuerCertificate Authority
ExpirationNot After date
Key AlgorithmRSA/ECDSA and size
Deployed LocationsServers, load balancers, CDNs
OwnerTeam responsible
Auto-RenewalYes/No

Centralized Management Tools

Consider these approaches for large deployments:

  • HashiCorp Vault: PKI secrets engine for internal CAs
  • cert-manager: Kubernetes-native certificate management
  • AWS Certificate Manager: Managed certificates for AWS services
  • Cloudflare: Edge certificate management

Security Hardening

Modern TLS Configuration

# Nginx configuration for A+ rating
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

# HSTS
add_header Strict-Transport-Security "max-age=63072000" always;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;

Certificate Transparency

All publicly trusted certificates must be logged to CT logs. Verify your certificates are logged:

# Check CT log presence
curl "https://crt.sh/?q=example.com&output=json" | jq

Post-Quantum Considerations

As quantum computing advances, plan for hybrid certificates:

  • Monitor NIST post-quantum standardization progress
  • Test hybrid certificate support in your infrastructure
  • Plan migration timeline for quantum-resistant algorithms
  • Consider HPTLS for post-quantum TLS support

Conclusion

Effective certificate management requires automation, monitoring, and clear processes. The cost of getting it wrong—outages, security breaches, compliance failures—far exceeds the investment in proper tooling and practices.

Start with automation (ACME), add comprehensive monitoring, and build processes for handling exceptions. Your future self will thank you when that 3 AM expiration alert never comes.

Interested in learning more?

Get in touch with our team to discuss how we can help with your cryptography needs.

Book a Meeting