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.
Real Certbot steps. Public DNS proof. A renewal plan that tells the truth.
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.
Light blue - Private Server 02A different certificate, a different Certbot token, and its own renewal deadline.
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.
Use a different short hostname.
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
SERVER 02 HTTPS NAMEprivate-server-2.pri.example.com
SERVER 02 PUBLIC TXT NAME_acme-challenge.private-server-2.pri.example.com
Personalize a real public domain and email before copying issuance commands.
DNS STATION / LIGHT VIOLET
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.
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.
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
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.
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.
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.
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
Nginx / directives for existing HTTPS server block
# Add or update INSIDE the matching server { ... } block:
ssl_certificate /etc/letsencrypt/live/private-server-1.pri.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/private-server-1.pri.example.com/privkey.pem;
Nginx / verify configuration before reload
sudo nginx -t
sudo systemctl reload nginx
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
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
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 SERVER STATION / HOST 02
Server 02 - private-server-2
Run these commands on private-server-2.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.
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 02 / APT installation only if Certbot is absent
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.
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.
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.
Normally, Certbot stores the chain at /etc/letsencrypt/live/private-server-2.pri.example.com/fullchain.pem and the key at /etc/letsencrypt/live/private-server-2.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-2.pri.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/private-server-2.pri.example.com/privkey.pem
Nginx / directives for existing HTTPS server block
# Add or update INSIDE the matching server { ... } block:
ssl_certificate /etc/letsencrypt/live/private-server-2.pri.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/private-server-2.pri.example.com/privkey.pem;
Nginx / verify configuration before reload
sudo nginx -t
sudo systemctl reload nginx
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
if sudo openssl x509 -in /etc/letsencrypt/live/private-server-2.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 02 / manual re-issuance when renewal is due
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
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
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.
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.
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.