Menu
SMORTLER + SI / VIOLET FIELD GUIDE / CERTIFICATE CONTROL

No DNS API?
No problem.
Manual DNS-01.

A private server can earn public trust without opening a public web port. Violet is ready to walk you through the DNS handshake - one deliberate, verified step at a time.

Launch the DNS mission ↓
Real Certbot steps. Public DNS proof. A renewal plan that tells the truth.
Violet, the approved white-and-violet SI robot, guiding the DNS certificate mission
A VIOLET FIELD MISSION / UBUNTU 24.04 / ZERO DNS API KEYS

Make public DNS prove a private identity.

Updated from the original SMORTLER guide for private-server-1.pri.smortler.com. This edition keeps that real-world private-VM scenario, but makes the steps reusable for your own domain and for one or two private machines. A public DNS TXT record lets Let's Encrypt validate a hostname even when its web server has no public IP address.

Nothing you enter here is submitted or saved. The challenge TXT value is public DNS data, not an account secret. Never enter passwords, API keys or certificate private keys into this page.

01 / REQUESTCertbot pauses
02 / PUBLISHPublic TXT record
03 / PROVELet's Encrypt checks
04 / OPERATEPrivate HTTPS
Manual means manual at renewal, too. This guide requires human access to public DNS every time the certificate must be renewed. It does not claim that an unattended timer can renew manual DNS-01 certificates. For verified API-driven automation, see our Route 53 guide or GoDaddy guide, subject to their stated requirements.

Who handles the mission?

Light violet - Public DNS administratorPublish the TXT value in the correct authoritative public zone. An internal DNS record alone is not enough.
Light green - Private Server 01Run Certbot, inspect the certificate, configure HTTPS and plan renewal.

Personalize Violet's field guide

Change the hostnames once. Violet updates public TXT names, provider-relative DNS labels, Certbot commands, Apache/Nginx paths and verification commands. This runs entirely in your browser.

Each server gets an independent certificate and TXT value.

Switches the HTTPS configuration examples.

Example: smortler.com. Use a real registered public domain.

Example: pri or lab.office. Leave blank if unnecessary.

One label only - for example private-server-1.

Only change when the public subzone is delegated. Example: pri.smortler.com instead of smortler.com.

A real email enables copying certificate issuance commands.

SERVER 01 HTTPS NAMEprivate-server-1.pri.example.com
SERVER 01 PUBLIC TXT NAME_acme-challenge.private-server-1.pri.example.com
Personalize a real public domain and email before copying issuance commands.
DNS STATION / LIGHT VIOLET
Violet analyzing DNS names

Find the public DNS zone - not just your internal one.

DNS-01 checks the public authoritative DNS for your domain. It does not require a public A record for the private hostname, but it does require control over its publicly queryable TXT challenge name. Your registrar and public DNS provider may be different companies.

01

Check authoritative public DNS and delegation

DNS administrator / public zone checks
dig @1.1.1.1 NS example.com +short
dig @1.1.1.1 NS example.com +short
dig +trace TXT _acme-challenge.private-server-1.pri.example.com

Inspect the actual authoritative zone and any delegated subzone. In a split-horizon configuration, do not confuse your private internal authoritative DNS with the public zone that Let's Encrypt can query. A CNAME-based challenge delegation also changes where you must place TXT records.

02

Prepare for a manual TXT change

The domain registrar or public DNS administrator must be able to edit TXT records. Use the lowest convenient DNS TTL supported by the provider (often 300 seconds). Do not publish a made-up token: the value is generated by Certbot only after the request starts.

The correct provider record-name format depends on which public DNS zone hosts the record. Use the full name or the zone-relative label from the workbench, not both. Some DNS interfaces append the zone automatically.

VIOLET SERVER STATION / HOST 01

Server 01 - private-server-1

Run these commands on private-server-1.pri.example.com using an account with sudo rights. This is for one certificate on this server. Server 02, if enabled, requires a separate token and certificate run.

01

Identify Certbot and preserve existing certificates

Before installation or issuance, inspect this machine. If this is an existing certificate, confirm its exact Certificate Name and complete list of domains first. Do not replace a working authenticator or certificate lineage blindly.

Server 01 / read-only inspection
cat /etc/os-release | head -n 5
command -v certbot || true
certbot --version 2>/dev/null || true
sudo certbot certificates 2>/dev/null || true
systemctl list-timers --all | grep -i certbot || true
02

Install Certbot on a clean Ubuntu 24.04 server

For a new Ubuntu 24.04 VM with no existing Certbot, the Ubuntu APT package includes the built-in manual authenticator. There is no separate manual-DNS plugin to install. If you already use Snap or another Certbot installation, keep that installation and skip this step.

Server 01 / APT installation only if Certbot is absent
sudo apt update
sudo apt install -y certbot dnsutils
certbot --version

Use only one Certbot installation method per server. Installing additional packages changes your machine; inspect first.

03

Ask Certbot for the manual DNS challenge

Open a terminal you can leave running. Certbot will pause and display the TXT record name and a fresh value. Do not press Enter yet. Hand the value to the DNS administrator, or paste it into the private-to-your-browser TXT workbench below.

Server 01 / production certificate - interactive
sudo certbot certonly --manual \
  --preferred-challenges dns \
  --agree-tos --email YOUR_REAL_EMAIL@YOUR_DOMAIN \
  --cert-name private-server-1.pri.example.com \
  -d private-server-1.pri.example.com

Important: Use the exact response printed by this Certbot run, never the illustrated example in an older article. DNS-01 does not require the web server to expose port 80 to the public internet.

04

Pause at the TXT handoff - verify public DNS

Leave Certbot waiting. In the DNS workbench, enter the TXT response and copy the record name/value into your real authoritative public DNS. Then check from an internet-connected computer. DNS providers differ: some ask for a record name relative to the zone; others accept the full name.

Server 01 / confirm public DNS answer
dig @1.1.1.1 TXT _acme-challenge.private-server-1.pri.example.com +short
dig @8.8.8.8 TXT _acme-challenge.private-server-1.pri.example.com +short

Both queries should show the exact value Certbot provided (possibly surrounded by quotes). These two resolvers are useful checks, not a guarantee that every authoritative DNS server has updated. If the answers are inconsistent, allow more propagation time and check the authoritative nameservers.

05

Complete validation and examine the new certificate

Once the correct public TXT response is visible, return to the waiting Certbot terminal and press Enter once. After Certbot reports success, inspect the actual path rather than guessing it.

Server 01 / confirm the issued certificate
sudo certbot certificates
sudo openssl x509 -in /etc/letsencrypt/live/private-server-1.pri.example.com/fullchain.pem -noout -subject -issuer -dates

Normally, Certbot stores the chain at /etc/letsencrypt/live/private-server-1.pri.example.com/fullchain.pem and the key at /etc/letsencrypt/live/private-server-1.pri.example.com/privkey.pem. A preexisting name can cause a different lineage; trust the output of certbot certificates.

06

Connect the certificate to your existing web server

Issuance does not by itself update Apache or Nginx because certonly obtains the certificate without installing it. Use the corresponding example inside your existing HTTPS virtual host or server block. Do not paste either snippet directly into a terminal or replace a working virtual host blindly.

Apache / directives for existing :443 virtual host
# Add or update INSIDE the matching <VirtualHost *:443> block:
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/private-server-1.pri.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/private-server-1.pri.example.com/privkey.pem
Apache / verify configuration before reload
sudo a2enmod ssl
sudo apache2ctl configtest
sudo systemctl reload apache2

The HTTPS listener, ServerName/server_name, internal DNS, inbound private-network firewall rules, and website root still must be configured for your environment. These are certificate directives, not complete virtual-host files.

07

Verify the actual HTTPS certificate and its expiration

Server 01 / check on an internal network client
openssl s_client -connect private-server-1.pri.example.com:443 \
  -servername private-server-1.pri.example.com < /dev/null 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates
Server 01 / read-only 30-day expiry test
if sudo openssl x509 -in /etc/letsencrypt/live/private-server-1.pri.example.com/cert.pem -noout -checkend 2592000; then
  echo 'Certificate is not within 30 days of expiration.'
else
  echo 'Manual renewal should be completed now.'
fi

The HTTPS check assumes your internal DNS resolves the hostname to the private server and port 443 is available internally. If DNS is intentionally split, run from an internal client. The expiration command only reads a file - it does not perform renewal.

08

Renew manually - new TXT value every time

When the renewal window approaches, repeat the interactive Certbot command on this server, preserving the correct certificate name and all previously covered domains. Each run provides a new DNS challenge. Publish the fresh TXT value, verify public propagation, finish the prompt, then recheck and reload your web server if necessary.

Server 01 / manual re-issuance when renewal is due
sudo certbot certonly --manual \
  --preferred-challenges dns \
  --agree-tos --email YOUR_REAL_EMAIL@YOUR_DOMAIN \
  --cert-name private-server-1.pri.example.com \
  -d private-server-1.pri.example.com

Not unattended renewal: A cron or systemd timer running certbot renew does not know how to change your DNS without a manual authentication hook. This page intentionally does not install a misleading automatic-renewal job. Check all SANs on existing certificates before renewing; these one-name commands are examples for one-name certificates.

VIOLET'S TXT WORKBENCH / LIGHT VIOLET

Put the exact answer in the exact place.

Start the Certbot command on your private server. When it pauses, paste only the temporary TXT validation value below. Violet will prepare the full public record name, the zone-relative label and public DNS lookup commands. This helper does not change DNS and never sends the value to SMORTLER.

Server 01 / TXT responseWaiting for Certbot

The actual challenge changes every time you issue or renew.

PUBLIC ZONEexample.com
FULL DNS RECORD NAME_acme-challenge.private-server-1.pri.example.com
RELATIVE LABEL FOR THE SELECTED ZONE_acme-challenge.private-server-1.pri
Copy public FQDN / server 01
_acme-challenge.private-server-1.pri.example.com
Copy provider-relative TXT name / server 01
_acme-challenge.private-server-1.pri
Copy Certbot TXT value / server 01
PASTE_TXT_VALUE_FROM_CERTBOT
Read public TXT after DNS admin saves
dig @1.1.1.1 TXT _acme-challenge.private-server-1.pri.example.com +short
dig @8.8.8.8 TXT _acme-challenge.private-server-1.pri.example.com +short
Before you press Enter in Certbot: public DNS must show the current token. A public resolver check is a helpful indication; if validation still fails, compare authoritative nameservers and propagation. After success, delete only the stale challenge value you added - never erase a TXT value another live issuance still needs.
RENEWAL OPERATIONS / PERSONAL REMINDER
Violet celebrating successful certificate validation

Your renewal is a human appointment.

Use the expiration date printed by certbot certificates or openssl x509 -noout -enddate. Select the calendar date below and Violet will show a 30-day preparation date. You can download a calendar reminder file for yourself - generated in your browser without contacting any server.

Get the real date from your server. The calendar event is advisory, not an automatic certificate monitor.

Enter the expiration date to calculate the 30-day renewal checkpoint.
Read expiration and existing certificate list
sudo certbot certificates
sudo openssl x509 -in /etc/letsencrypt/live/private-server-1.pri.example.com/cert.pem -noout -enddate

Operational reality: a calendar reminder is not certificate monitoring, nor does it renew anything. Set up independent expiration alerting in your normal monitoring system if you operate production services. If you switch to an automated DNS authenticator later, test that renewal pipeline separately.

FINAL MISSION CHECK / VIOLET VALIDATION

Seven things to confirm before calling it done.

0 of 7 confirmedThese are your own manual checks - not a live server test.
Violet's operating rule: The certificate is not the end of the job. A trustworthy service needs a validated issuance, a correctly served chain, and a renewal process that someone will actually perform.
TROUBLESHOOTING / HUMAN-IN-THE-LOOP DNS

When something doesn't line up

My internal DNS has the TXT record, but public checks are empty

Let's Encrypt queries the public DNS hierarchy. The internal DNS zone may only be visible inside your network. Add the TXT to the correct public authoritative zone or configured DNS-01 delegated target. It is normal for the private hostname's A record to exist only in internal DNS.

The DNS provider automatically appends the domain name

Use the relative label calculated from your selected public DNS zone, not the full name. Example: if the public zone is example.com, the label might be _acme-challenge.private-server-1.pri. Check the resulting full DNS name shown by the provider before saving.

My DNS zone is delegated to a subdomain

Enter the delegated public zone in the optional public DNS zone field. For example, a delegation of pri.example.com means the provider-relative label is _acme-challenge.private-server-1. Make sure that subzone is publicly delegated and authoritative. The field does not itself change DNS delegation.

TXT lookups show an old value or multiple values

Certbot uses a new validation response for each challenge. Some legitimate certificate requests use multiple TXT values at the same name simultaneously. Do not remove current values from another live request. Once validation is complete, safely clean up old temporary values to keep DNS responses small.

The Certbot command is waiting and I'm not sure when to press Enter

Keep the Certbot terminal open until the exact current TXT value appears in the public DNS answers. Then press Enter once. If validation fails, a new Certbot request may generate a new value; do not keep reusing the previous one.

My browser doesn't trust the internal HTTPS server

Check the requested hostname against the certificate SAN, the served fullchain, local date/time, internal DNS mapping, and the :443 virtual host configuration. You must connect using a name covered by the certificate. Public trust does not make an internal server reachable from the internet.

Can a cron job or Certbot dry run do the manual renewal for me?

No. Without an automated authentication hook, an unattended job cannot create the new TXT challenge. A --dry-run is a test, not a reliable expiration notification service. Use a human renewal appointment with real monitoring, or move to a verified DNS API method.

What about wildcard certificates or several names on one certificate?

DNS-01 supports wildcard issuance, but each requested identifier can generate its own challenge. Wildcard and base names can require multiple TXT values at the same challenge hostname. This guide's generated -d command intentionally covers only one normal hostname. Inspect the full domain list before renewing an existing multi-name certificate.

Can I request a certificate for an internal-only or unregistered name?

Public certificate authorities must be able to validate control through the public DNS hierarchy. You cannot get a publicly trusted certificate for a name that exists only in private DNS and has no valid registered domain backing it. Use a name under a public registered domain even if the service remains private.

Technical references and companion HowTos

SMORTLER + SI HowTo - Return to all HowTos. Independent technical field guide, updated October 28, 2026. This page never transmits hostnames, challenge answers or reminder dates.