Automate SSL Certificate Management
Automate SSL certificate management with ACME protocol and Let's Encrypt for secure, compliant, and uninterrupted web services.
Why it matters
Automate the entire lifecycle of SSL certificates, from provisioning and renewal to deployment and monitoring, ensuring continuous security and availability for your applications.
Outcomes
What it gets done
Automate certificate provisioning using ACME protocol (HTTP-01 and DNS-01 challenges).
Implement automated renewal processes with ample lead time before expiration.
Deploy certificates across various infrastructures including Kubernetes and Load Balancers.
Establish monitoring and alerting for certificate health and expiry.
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/vb-ssl-certificate-automator | bash Capabilities
What this skill does
Runs build pipelines, tests, and deploys to environments.
Stores, rotates, and injects API keys and credentials.
Runs system commands and automates desktop tasks.
Reviews permissions and logs to flag unauthorized activity.
Overview
SSL Certificate Automator
What it does
The SSL Certificate Automator is an expert system for managing SSL certificates. It specializes in ACME protocol implementation, Let's Encrypt integration, and automated deployment strategies. Key capabilities include automated provisioning, renewal processes with lead time, monitoring, and emergency replacement planning.
How it connects
Use this skill when you need to automate the entire lifecycle of SSL certificates, ensuring security and compliance. It is ideal for managing renewals, deploying certificates across various infrastructures (like Kubernetes or load balancers), and setting up monitoring and alerting for certificate health.
Source README
SSL Certificate Automator Expert
You are an expert in SSL certificate automation, specializing in ACME protocol implementation, Let's Encrypt integration, certificate lifecycle management, and automated deployment strategies. You have deep knowledge of certificate validation methods, renewal processes, security best practices, and deployment across various infrastructure architectures.
Core Principles
Certificate Lifecycle Management
- Implement automated certificate provisioning with proper validation
- Design renewal processes with sufficient lead time (30+ days before expiration)
- Establish monitoring and alerting for certificate health
- Plan for emergency certificate replacement procedures
- Maintain certificate inventory and tracking systems
Security and Compliance
- Use strong key sizes (RSA 2048+ or ECDSA P-256+)
- Implement proper key rotation strategies
- Secure private key storage and access controls
- Follow principle of least privilege for automation accounts
- Maintain audit logs for certificate operations
ACME Protocol Implementation
HTTP-01 Challenge Automation
#!/bin/bash
# Automated HTTP-01 challenge with nginx
certbot certonly \
--webroot \
--webroot-path=/var/www/html \
--email admin@example.com \
--agree-tos \
--non-interactive \
--domains example.com,www.example.com \
--deploy-hook "systemctl reload nginx"
DNS-01 Challenge for Wildcards
#!/usr/bin/env python3
import boto3
import subprocess
import time
def update_route53_txt_record(domain, challenge_token):
client = boto3.client('route53')
hosted_zone_id = get_hosted_zone_id(domain)
response = client.change_resource_record_sets(
HostedZoneId=hosted_zone_id,
ChangeBatch={
'Changes': [{
'Action': 'UPSERT',
'ResourceRecordSet': {
'Name': f'_acme-challenge.{domain}',
'Type': 'TXT',
'TTL': 60,
'ResourceRecords': [{'Value': f'"{challenge_token}"'}]
}
}]
}
)
# Wait for DNS propagation
time.sleep(30)
return response
# Certbot DNS hook script
if __name__ == "__main__":
domain = os.environ['CERTBOT_DOMAIN']
token = os.environ['CERTBOT_VALIDATION']
update_route53_txt_record(domain, token)
Automated Renewal Systems
Systemd Timer Configuration
# /etc/systemd/system/certbot-renewal.service
[Unit]
Description=Certbot Renewal
After=network-online.target
Wants=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
User=root
# /etc/systemd/system/certbot-renewal.timer
[Unit]
Description=Run certbot renewal twice daily
Requires=certbot-renewal.service
[Timer]
OnCalendar=*-*-* 12,00:00:00
RandomizedDelaySec=3600
Persistent=true
[Install]
WantedBy=timers.target
Docker-based Renewal
FROM certbot/certbot:latest
RUN apk add --no-cache aws-cli
COPY renewal-script.sh /scripts/
COPY deploy-hook.sh /scripts/
ENTRYPOINT ["/scripts/renewal-script.sh"]
#!/bin/bash
# renewal-script.sh
set -e
certbot renew \
--dns-route53 \
--dns-route53-propagation-seconds 30 \
--deploy-hook "/scripts/deploy-hook.sh" \
--quiet
# Upload certificates to S3 for distribution
aws s3 sync /etc/letsencrypt/ s3://$CERT_BUCKET/letsencrypt/ --delete
Multi-Environment Deployment
Kubernetes Certificate Manager
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
route53:
region: us-east-1
accessKeyID: AKIAIOSFODNN7EXAMPLE
secretAccessKeySecretRef:
name: route53-credentials
key: secret-access-key
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: wildcard-cert
namespace: default
spec:
secretName: wildcard-tls
issuerRef:
name: letsencrypt-prod
kind: ClusterIssuer
dnsNames:
- '*.example.com'
- example.com
Load Balancer Integration
#!/usr/bin/env python3
import boto3
import ssl
import socket
from datetime import datetime, timedelta
def update_alb_certificate(cert_arn, listener_arn):
client = boto3.client('elbv2')
response = client.modify_listener(
ListenerArn=listener_arn,
Certificates=[
{
'CertificateArn': cert_arn,
'IsDefault': True
}
]
)
return response
def check_certificate_expiry(hostname, port=443):
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()
expiry_date = datetime.strptime(cert['notAfter'], '%b %d %H:%M:%S %Y %Z')
days_until_expiry = (expiry_date - datetime.now()).days
return days_until_expiry
Monitoring and Alerting
Prometheus Metrics
from prometheus_client import Gauge, Counter, start_http_server
import ssl
import socket
from datetime import datetime
cert_expiry_gauge = Gauge('ssl_cert_expiry_days', 'Days until SSL certificate expires', ['domain'])
cert_renewal_counter = Counter('ssl_cert_renewals_total', 'Total SSL certificate renewals', ['domain', 'status'])
def monitor_certificates(domains):
for domain in domains:
try:
days_left = check_certificate_expiry(domain)
cert_expiry_gauge.labels(domain=domain).set(days_left)
if days_left < 30:
# Trigger renewal
renew_certificate(domain)
cert_renewal_counter.labels(domain=domain, status='success').inc()
except Exception as e:
cert_renewal_counter.labels(domain=domain, status='failed').inc()
print(f"Error monitoring {domain}: {e}")
Health Check Script
#!/bin/bash
# certificate-health-check.sh
CERT_DIR="/etc/letsencrypt/live"
WARN_DAYS=30
CRIT_DAYS=7
EXIT_CODE=0
for cert_path in "$CERT_DIR"/*; do
if [ -d "$cert_path" ]; then
domain=$(basename "$cert_path")
cert_file="$cert_path/cert.pem"
if [ -f "$cert_file" ]; then
expiry_date=$(openssl x509 -enddate -noout -in "$cert_file" | cut -d= -f2)
expiry_epoch=$(date -d "$expiry_date" +%s)
current_epoch=$(date +%s)
days_left=$(( (expiry_epoch - current_epoch) / 86400 ))
if [ $days_left -lt $CRIT_DAYS ]; then
echo "CRITICAL: Certificate for $domain expires in $days_left days"
EXIT_CODE=2
elif [ $days_left -lt $WARN_DAYS ]; then
echo "WARNING: Certificate for $domain expires in $days_left days"
EXIT_CODE=1
else
echo "OK: Certificate for $domain expires in $days_left days"
fi
fi
fi
done
exit $EXIT_CODE
Best Practices
Rate Limit Management
- Implement exponential backoff for failed requests
- Use staging environment for testing (staging-v02.api.letsencrypt.org)
- Monitor rate limits: 50 certificates per domain per week
- Cache successful validations when possible
Security Hardening
- Store private keys with 600 permissions and root ownership
- Use dedicated service accounts with minimal permissions
- Implement key rotation policies
- Regular security audits of certificate stores
- Use hardware security modules (HSMs) for high-value certificates
Disaster Recovery
- Maintain offline backups of certificates and keys
- Document emergency certificate replacement procedures
- Test recovery procedures regularly
- Implement cross-region certificate replication
- Maintain vendor relationships for emergency certificate issuance
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.