Automated TLS Certificates with ACME: Validation Method, Rate Limits and State You Must Keep
Choosing between HTTP-01, DNS-01 and TLS-ALPN-01, where Let's Encrypt rate limits will catch you, the state you actually need to back up, and pitfalls like split-horizon DNS, AAAA records and transparency logs.
Automated certificate management is sold as "set it and forget it", and for the first three months of most deployments that is exactly how it goes. The trouble starts when you have to rebuild the system, when short-lived test environments multiply, or when the DNS for a domain belongs to another team. This article covers the decisions that actually matter when you set up an ACME-based certificate flow (Let's Encrypt being the common example), where the rate limits will catch you, and the pitfalls you are almost guaranteed to hit.
Three validation methods, one real decision
Before issuing a certificate, ACME proves that you control the name in one of three ways:
HTTP-01: the CA fetches a file under /.well-known/acme-challenge/ on port 80 of the domain. It is the easiest to set up; the only requirements are that the name resolves directly to that server and port 80 is reachable from the internet.
DNS-01: you publish a TXT record named _acme-challenge.<domain>. The server does not need to be publicly reachable, and wildcard certificates (*.example.com) can only be obtained this way. The cost is that the ACME client must hold an API credential with write access to your DNS provider.
TLS-ALPN-01: validation happens on port 443 using a dedicated ALPN protocol. It exists for environments where port 80 can never be opened; otherwise it carries the same constraints as HTTP-01.
Our position is clear. If you have a single public server, HTTP-01 is enough and requires fewer privileges. The moment you have several servers, services on a private network, ephemeral environments, or a need for wildcards, move to DNS-01. Many teams start with HTTP-01 and limp along for years by hand-patching every exception; switching at the second exception is cheaper. Scope the DNS API credential as tightly as the provider allows, ideally to a single zone or to TXT records only. If the provider cannot do that, delegate a dedicated validation zone and point each _acme-challenge name at it with a CNAME. It is both safer and widely used.
When the rate limits hit you first
Let's Encrypt's limits are invisible in day-to-day use because they allow dozens of certificates per registered domain per week. The scenario that hurts is this: every CI run or preview environment mints its own new subdomain and requests its own certificate. The limit applies to the registered domain as a whole (example.com), not to the subdomain, so if your test environments share the production domain, production pays for the exhausted quota and a genuine renewal gets refused the same week.
Three measures work together:
Use the staging environment while testing the flow. Its directory URL is https://acme-staging-v02.api.letsencrypt.org/directory; the limits are far more generous, browsers do not trust the certificates it issues, but it is enough to prove the pipeline works. For certbot, the --dry-run flag does precisely this.
Put ephemeral environments under a dedicated parent domain and obtain one wildcard certificate they all share. A hundred environments, zero new certificates.
Do not request certificates for the same set of names over and over. The "duplicate certificate" limit is separate and much lower; a client that starts from scratch on every rebuild hits it within two days.
What you must persist is state, not the certificate
The most common mistake is backing up the certificate but not the ACME account and client state. The certificate renews every three months anyway; if it is lost, you request a new one. But if the account key and the record of "this certificate was already issued" are lost, the client treats everything as new, the quota fills instantly, and you lose the renewal exemptions.
In practice this means the entire /etc/letsencrypt directory for certbot, the single acme.json file for tools like Traefik, and in Kubernetes the Secret objects in which cert-manager stores the account key and issued certificates. If your cluster backup excludes Secrets, the first thing you will meet after a disaster restore is a rate-limit error. For the same reason, if client state lives on shared storage, guarantee that only one instance writes to it; two instances sharing an account and opening separate orders will trample both the limit and each other's certificates.
Working examples
HTTP-01 on a single server, served from the web server's document root:
certbot renew only renews certificates that are approaching expiry, and the timer shipped with the package attempts it twice a day. If you write your own cron entry, keep the same frequency; a "once a month" renewal loses the certificate on a single DNS outage.
DNS-01 in Kubernetes with cert-manager, Cloudflare example:
Apply it first with the server line pointing at staging, wait until kubectl describe certificate shows Ready, then switch to the production URL. That two-line discipline prevents most of the setups that burn through their quota.
Pitfalls
If an AAAA record exists, validation arrives over IPv6. Publish an IPv6 address for the name without actually serving on it and HTTP-01 fails quietly; the error will not tell you that IPv4 works fine. Either remove the AAAA record or genuinely serve IPv6.
A CAA record is a lock that gets forgotten when teams change. A record such as example.com. CAA 0 issue "letsencrypt.org" blocks other CAs. When you switch CAs or hand a subdomain to another provider, this is the first place to look.
Split-horizon DNS breaks the client's pre-check. cert-manager and similar tools attempt the validation themselves before contacting the CA. If internal DNS resolves the name to a private address, that pre-check hangs and the order is never placed. With DNS-01, tell the client to consult only external resolvers; cert-manager's --dns01-recursive-nameservers and --dns01-recursive-nameservers-only flags exist for exactly this.
Failed validations have their own limit. A misconfigured client retrying every minute locks itself out for that name within the hour. Set automatic retry intervals in hours, not minutes.
Every publicly trusted certificate is written to transparency logs. The names of your internal services (vault.internal.example.com and the like) become publicly searchable. A wildcard certificate hides those names; per-name certificates do not.
A wildcard covers exactly one level.*.example.com is valid for a.example.com but not for example.com (the apex) or a.b.example.com. Add the apex as a separate name.
A redirect on port 80 can break validation. If you redirect HTTP to HTTPS, exempt /.well-known/acme-challenge/ from that rule, or make sure the redirect lands on a valid certificate; on first setup there is no certificate yet, so the second option is usually not available.
When not to choose this route
For environments that never touch the internet, air-gapped networks, and internal services that only your own clients talk to, a public CA is the wrong tool: validation depends on the outside world, your names end up in public logs, and short-lived certificates tie every renewal to external connectivity. Run a private CA instead. Some private CAs speak ACME, so you keep the same clients and the same automation; the only thing that changes is trust distribution, meaning you deliver the root certificate to clients yourself. Public ACME CAs also will not help if a compliance requirement demands organisation or extended validation (OV/EV), or if you are issuing client certificates for mTLS.
If you run a public service and certificate lifetimes keep shrinking by industry decision, manual certificate management has already stopped being an option. The right question is not "should we automate" but "with which validation method, storing state where, and protecting the quota how".
[OK] 25 records · 8 featured · 1 retainer · 16 standard
/02 services
services.tree
> note
· Prices are in USD. Volume discounts of 7% for 6-12 day projects and 14% for 13+ day projects apply. Programs of 100+ person-days are priced individually. Prices are negotiable based on scope, urgency and long-term collaboration.
> ls ~/products/ --open-source
[OK] 2 entries · 1 live · 1 pre-release
/03 products
products.list
liveopen source · mit/prod/01
filex
the self-hosted file manager that embeds anywhere
single go binary · vue/react/web-component embed · 5 storage drivers · realtime collab · rbac · native multi-tenancy · mcp server for ai agents
We build infrastructure, automate everything, and keep systems running.
BRF Tech is a Bursa-based DevSecOps and software consulting firm. We operate across 25 service areas, from Kubernetes cluster management to serverless platform setup, CI/CD pipeline design to AI agent development.
What we do is simple: we set up your systems, automate them, and make sure they won't wake you up at 3 AM. We codify your infrastructure with Terraform, move your deployments to GitOps with ArgoCD, and monitor everything with Prometheus. If something breaks — we intervene before it does.
We're against vendor lock-in. We work with open-source tools, self-hosted solutions, and industry-standard technologies. We build your own serverless platform on Knative, isolate with Kata Containers, manage your secrets with Vault. Every project is delivered with clear scope, clear timeline, clear pricing.
DevSecOps & CI/CD
Kubernetes & Serverless
Infrastructure as Code
AI & Agent (MCP/ACP)
Security & Zero Trust
Full-Stack Development
Self-Hosted Solutions
> grep -i question ~/faq.md
[OK] 3 entries · click to expand
[?]What services are included in BRF Tech's DevOps solutions?▾
We offer CI/CD pipeline setup, Kubernetes cluster management, container migration, infrastructure automation with Terraform, monitoring & alerting, in-house technology installations and DevOps consulting services.
[?]What are your software development services?▾
We offer MVP development, existing software performance optimization, backend API development (Node.js, Go, Python) and full-stack application development. Every project is delivered with minimal technical debt.
[?]Which DevOps tools do you work with?▾
From Kubernetes and Docker to Talos Linux, from Terraform and OpenTofu to Ansible, and across Jenkins, GitLab CI/CD, GitHub Actions, ArgoCD, Flux, Helm and Rancher, we work with industry-standard tooling. For observability and error tracking we use Prometheus, Grafana, Loki, Tempo, OpenTelemetry and GlitchTip; for networking, Cilium and Envoy; for test automation, Playwright, Cypress, k6, Locust, Testcontainers and Trivy. We determine the most suitable toolset together, based on your project’s needs.
Automated build, test and deployment pipelines with GitHub Actions, GitLab CI/CD.
Automated build, test and deploy pipeline setup for existing or new repositories. GitHub Actions, GitLab CI/CD or preferred tool is used. Separate workflows are defined for staging + production environments.
Container architecture migration, cluster setup and orchestration.
Production-ready Kubernetes cluster setup on bare-metal or cloud. Includes Helm charts, Ingress, TLS certificate management, namespace isolation and RBAC.
Migration of existing applications to container architecture.
Migration of existing applications to container architecture. Docker image design, Compose configuration and conversion to Kubernetes manifests. Kata Containers / gVisor can be included for advanced isolation.
In-house tools like GitLab, Nextcloud, VPN, mail server.
Installation of tools like GitLab, Mattermost, Nextcloud, mail server, VPN, internal monitoring on company servers. Deployed on Docker Compose or Kubernetes.
DB + cache + code bottleneck identification and resolution.
Profiling of existing application, identification and resolution of bottlenecks. DB query optimization, caching layer (Redis), service-level improvements.
MCP/ACP agents, RAG pipelines, multi-agent orchestration, model serving.
LLM integration (OpenAI, Claude, Gemini, local models), tool-augmented AI agents with MCP (Model Context Protocol) and ACP (Agent Communication Protocol). RAG pipeline, multi-agent orchestration, model serving (vLLM/Ollama). AI layer for existing business processes.
Event-driven data pipeline with Apache Kafka, RabbitMQ, NATS. ETL/ELT orchestration with Apache Airflow, real-time data streaming, CDC (Change Data Capture). Data lake/warehouse design, schema registry, dead letter queue management.
Packages
Kafka/RabbitMQ setup + basic producer/consumer
$3,500
5–7 person-day
ETL pipeline (Airflow + source → warehouse)
$5,200
8–12 person-day
Full event-driven architecture (CDC + streaming + DLQ)
Hands-on technical training for your teams. Docker & container fundamentals, Kubernetes operations, Terraform IaC, CI/CD best practices, AI/LLM integration workshops. Practical exercises in live lab environments, content customized by skill level.
E2E test automation with Playwright, Cypress, load testing with k6/Gatling. Pre-deploy quality gate integrated into CI/CD pipeline, test coverage reporting, visual regression testing. Reduce test writing time by up to 60% with AI-assisted test generation.
Your Collected Personal Data, Collection Method and Legal Basis
Any information that identifies or makes you identifiable is considered "personal data." When you visit our website or use our services, contact information such as your name, surname, email address, phone number, as well as your IP address and browser cookie data may be collected through automatic or semi-automatic means. This data is processed based on the legal grounds specified in Article 5 of the Personal Data Protection Law No. 6698: "being directly related to the establishment or performance of a contract" and "being mandatory for the legitimate interests of the data controller, provided that it does not harm the fundamental rights and freedoms of the data subject."
Purpose of Processing Your Personal Data
Your collected personal data is processed for the purposes of providing and improving our services, fulfilling customer requests, meeting legal obligations, conducting information security processes and managing communication activities. Your data is processed in a limited and proportionate manner for the stated purposes; when the purpose ceases to exist, data is deleted, destroyed or anonymized.
To Whom and For What Purposes Collected Personal Data May Be Transferred
Your personal data may be transferred to public institutions and organizations as required by legal regulations, to our business partners and technical infrastructure providers for the purpose of delivering services, and to lawyers and consultants in legal disputes. Transfers are carried out in accordance with Articles 8 and 9 of the Law, with necessary technical and administrative measures in place.
Your Rights as a Data Subject
In accordance with Article 11 of Law No. 6698, you have the right to: learn whether your personal data is being processed; request information if it has been processed; learn the purpose of processing and whether it is used in accordance with its purpose; know the third parties to whom it is transferred domestically or abroad; request correction if it has been processed incompletely or incorrectly; request deletion or destruction within the framework of conditions set out in Article 7 of the Law; request that the operations carried out be notified to third parties to whom data has been transferred; object to any adverse result arising from the analysis of data exclusively through automated systems; and claim compensation for damages in case of unlawful processing. You may contact us through the communication channels on our website to exercise these rights.
Terms & Conditions
Terms & Conditions
1. Service Scope and Changes
BRF Tech conducts its software development, DevOps consulting, infrastructure setup and technical support services within the framework of these terms and conditions. The scope of service is determined separately for each project and finalized through mutual agreement. BRF Tech reserves the right to update the scope, pricing and technical details of its services, provided that prior notice is given.
2. Privacy Policy
Personal data collected within the scope of our services is processed in accordance with our Privacy Policy. For detailed information, please review our Privacy Policy page.
3. Service Usage and Responsibilities
Clients agree to use the provided services solely within legal and ethical boundaries. BRF Tech reserves the right to suspend or terminate services in the event of misuse, violation of third-party rights, or use for illegal activities. The client is responsible for the accuracy and currency of the information provided within the project scope.
4. Payment Terms
Payment terms are determined on a project basis and finalized through mutual agreement at the start of the project. Unless otherwise specified, invoices are payable within 15 days of project delivery. A monthly late payment interest of 2% may apply to overdue payments.
5. Cancellation and Refund Policy
Cancellation requests must be submitted in writing at least 7 days before the service start date. For projects already in progress, billing is based on the proportion of completed work. No refunds are issued for software and infrastructure components specifically developed within the project scope.