AWS Certificate Manager (ACM) handles provisioning, managing, and deploying SSL/TLS certificates. Certificates secure connections for ALB, CloudFront, API Gateway, and other AWS services.
Free SSL/TLS certificates for public-facing resources. Automatically renewed. Requires domain validation via DNS or email. Can only be used with integrated AWS services.
Integrations: ALB, NLB, CloudFront, API Gateway, Elastic Beanstalk, CloudFormation
Private CA for internal resources. Requires AWS Private CA (additional cost). Private key can be exported for use outside AWS. Supports custom validity periods.
Use cases: Internal services, IoT devices, on-premises resources, containers, EC2 instances
ACM itself has limited direct attack surface, but certificate enumeration reveals infrastructure, and mismanaged private CAs can enable MITM attacks. Expired certificates cause service outages.
aws acm list-certificates --region us-east-1aws acm describe-certificate --certificate-arn arn:aws:acm:us-east-1:123456789012:certificate/xxxaws acm list-tags-for-certificate --certificate-arn arn:aws:acm:...:certificate/xxxaws acm-pca list-certificate-authoritiesaws acm-pca get-certificate-authority-certificate --certificate-authority-arn arn:aws:acm-pca:...curl -s "https://crt.sh/?q=%.example.com&output=json" | jq -r '.[].name_value' | sort -uOSINT Tip: CT logs are a goldmine for subdomain enumeration. Use crt.sh, censys.io, or certspotter to discover all issued certificates.
aws acm list-certificates --query 'CertificateSummaryList[*].CertificateArn' --output textaws acm list-certificates --query 'CertificateSummaryList[*].[DomainName,SubjectAlternativeNameSummaries]' --output tableaws acm list-certificates --certificate-statuses ISSUED --query 'CertificateSummaryList[?NotAfter<=`2024-12-31`]'aws acm export-certificate \
--certificate-arn arn:aws:acm:...:certificate/xxx \
--passphrase $(echo -n 'password' | base64)curl -s "https://crt.sh/?q=%.target.com&output=json" | \
jq -r '.[].name_value' | sort -uaws acm describe-certificate \
--certificate-arn arn:aws:acm:...:certificate/xxx \
--query 'Certificate.InUseBy'{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "acm:*",
"Resource": "*"
}]
}Full ACM access allows certificate deletion, private key export, and private CA management
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"acm:DescribeCertificate",
"acm:ListCertificates",
"acm:ListTagsForCertificate"
],
"Resource": "*"
}]
}Read-only access for monitoring and inventory purposes
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"acm-pca:IssueCertificate",
"acm-pca:GetCertificate"
],
"Resource": "*"
}]
}Ability to issue certificates from any private CA enables MITM attacks
{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": ["acm-pca:IssueCertificate"],
"Resource": "arn:aws:acm-pca:*:*:certificate-authority/specific-ca-id",
"Condition": {
"StringEquals": {
"acm-pca:TemplateArn": "arn:aws:acm-pca:::template/EndEntityCertificate/V1"
}
}
}]
}Restricted to specific CA and certificate template
Example output from crt.sh query for target.com:
# Discovered subdomains from CT logs api.target.com staging-api.target.com dev.target.com admin.target.com internal.target.com # Internal service exposed! jenkins.target.com # CI/CD system gitlab.target.com # Source control vpn.target.com mail.target.com *.staging.target.com # Wildcard reveals staging env payments.target.com # High-value target dashboard.target.com
Attack Surface: CT logs reveal infrastructure that may not be in DNS. Internal hostnames, staging environments, and admin panels are often discovered this way.
Set up CloudWatch alarms for certificates expiring within 30 days.
aws cloudwatch put-metric-alarm \
--alarm-name CertExpiringSoon \
--metric-name DaysToExpiry \
--namespace AWS/CertificateManager \
--threshold 30 --comparison-operator LessThanThresholdPrevent private key export by denying acm:ExportCertificate action.
{
"Effect": "Deny",
"Action": "acm:ExportCertificate",
"Resource": "*"
}Don't use the same wildcard certificate across prod/staging/dev.
Log all ACM and ACM-PCA API calls for audit trail.
aws cloudtrail put-event-selectors \
--trail-name main-trail \
--event-selectors '[{"DataResources":[{"Type":"AWS::ACM::Certificate"}]}]'Use HSM-backed keys and restrict IssueCertificate permissions to specific templates.
Use DNS validation with Route 53 for automatic renewal without manual intervention.
aws acm request-certificate \
--domain-name example.com \
--validation-method DNS \
--domain-validation-options DomainName=example.com,ValidationDomain=example.comAWS ACM Security Card • Toc Consulting
Always obtain proper authorization before testing