Skip to content
GitHubXDiscord

CertificatePack

The Certificate Pack resource lets you create and manage Cloudflare Advanced Certificate Packs for flexible SSL/TLS certificates with multiple Certificate Authority options.

Important Requirements:

  • Advanced Certificate Manager (ACM) must be activated: Before using Certificate Packs, you must activate ACM in your Cloudflare dashboard. Navigate to your domain > SSL/TLS > Edge Certificates and click Activate for Advanced Certificate Manager. This requires a $10/month subscription per domain.
  • Requires a paid Cloudflare plan (not available on Free plans)
  • Certificate provisioning can take up to 10 minutes
  • Most properties are immutable after creation (only cloudflareBranding can be updated)

Create a basic certificate pack with Let’s Encrypt for your domain.

import { Zone, CertificatePack } from "alchemy/cloudflare";
const zone = await Zone("my-zone", {
name: "example.com",
});
const basicCert = await CertificatePack("my-cert", {
zone: zone,
certificateAuthority: "lets_encrypt",
hosts: ["example.com", "www.example.com"],
validationMethod: "txt",
validityDays: 90,
});

Enterprise Certificate with Google Trust Services

Section titled “Enterprise Certificate with Google Trust Services”

Create an enterprise-grade certificate with Google Trust Services and Cloudflare branding.

const enterpriseCert = await CertificatePack("enterprise-cert", {
zone: "example.com", // Can use zone ID string or Zone resource
certificateAuthority: "google",
hosts: ["example.com", "*.example.com", "api.example.com"],
validationMethod: "txt",
validityDays: 365,
cloudflareBranding: true,
});

Create a wildcard certificate using SSL.com with email validation.

const wildcardCert = await CertificatePack("wildcard-cert", {
zone: myZone,
certificateAuthority: "ssl_com",
hosts: ["example.com", "*.example.com"],
validationMethod: "email",
validityDays: 365,
});

Create a certificate covering multiple subdomains with Let’s Encrypt.

const multiDomainCert = await CertificatePack("multi-cert", {
zone: "example.com",
certificateAuthority: "lets_encrypt",
hosts: [
"example.com",
"www.example.com",
"api.example.com",
"admin.example.com",
"blog.example.com"
],
validationMethod: "http",
validityDays: 90,
});
PropertyTypeRequiredDescription
zonestring | ZoneYesZone resource or zone ID where the certificate will be created
certificateAuthority"google" | "lets_encrypt" | "ssl_com"YesCertificate Authority to use for issuing the certificate
hostsstring[]YesList of hostnames (max 50, must include zone apex)
validationMethod"txt" | "http" | "email"YesDomain ownership validation method
validityDays14 | 30 | 90 | 365YesCertificate validity period in days
cloudflareBrandingbooleanNoAdd Cloudflare branding subdomain as Common Name (default: false)
type"advanced"NoCertificate type (only “advanced” supported, default: “advanced”)
deletebooleanNoWhether to delete the certificate pack on destroy (default: true)
  • Cost: Free
  • Best for: Basic SSL needs, development environments
  • Validity: Shorter periods (14, 30, 90 days)
  • Features: Standard domain validation
  • Cost: Paid
  • Best for: Enterprise applications, production environments
  • Validity: Up to 365 days
  • Features: Enhanced validation, enterprise support
  • Cost: Commercial
  • Best for: Commercial applications requiring extended validation
  • Validity: Up to 365 days
  • Features: Extended validation options, commercial support
  • Add DNS TXT record to prove domain ownership
  • Most reliable method for automation
  • Works with all domain configurations
  • Upload verification file to domain’s web server
  • Requires web server access
  • Good for domains with existing websites
  • Receive validation email at admin addresses
  • Requires access to domain admin email
  • Manual validation process

Most certificate pack properties cannot be changed after creation. To modify these properties, you must delete and recreate the certificate pack:

  • Certificate Authority (certificateAuthority)
  • Hostnames (hosts)
  • Validation Method (validationMethod)
  • Validity Period (validityDays)
  • Type (type)

Only cloudflareBranding can be updated after creation:

// Update to enable Cloudflare branding
const updatedCert = await CertificatePack("my-cert", {
zone: zone,
certificateAuthority: "lets_encrypt", // Must match original
hosts: ["example.com", "www.example.com"], // Must match original
validationMethod: "txt", // Must match original
validityDays: 90, // Must match original
cloudflareBranding: true, // Only this can change
});
  • Maximum 50 hostnames per certificate pack
  • Must include the zone apex (root domain)
  • Supports wildcards (e.g., *.example.com)
  • Cannot be empty
  • Certificate packs take time to provision and become active
  • Full deployment can take up to 10 minutes
  • Monitor the status property to track progress

Advanced Certificate Packs require a paid Cloudflare plan. Free plans cannot create certificate packs and will receive subscription-related errors.

Certificate packs progress through various status values during their lifecycle:

  • initializing - Certificate pack creation in progress
  • pending_validation - Waiting for domain validation
  • pending_issuance - Certificate being issued by CA
  • pending_deployment - Certificate being deployed to edge
  • active - Certificate is live and serving traffic
  • expired - Certificate has expired
  • deleted - Certificate pack has been deleted

Error states include *_timed_out variants when operations exceed time limits.

import { waitForCertificatePackActive } from "alchemy/cloudflare/certificate-pack";
// Wait for certificate to become active (up to 10 minutes)
const finalStatus = await waitForCertificatePackActive(
api,
zone.id,
certificatePack.id,
10 * 60 * 1000 // 10 minutes timeout
);
console.log(`Certificate pack is now: ${finalStatus}`);