Let Violet guide the verification. Own the DNS challenge, issue a trusted certificate, and build a renewal process that can prove itself - without opening an inbound public web port.
An interactive guide - your hostnames stay in your browser. Never enter secrets.
VIOLET SECURITY MISSION / PRIVATE UBUNTU 24.04
Make DNS do the proving.
These instructions focus on new Let's Encrypt certificates for one or two private Ubuntu 24.04 servers using Apache and a third-party GoDaddy DNS plugin. Enter a short hostname, optional subdomain, and base domain once. Violet updates the resulting DNS challenge names, certificate paths and copyable server commands.
No GoDaddy API credentials are entered into this page. All examples are for demonstration. Installing software or issuing certificates changes your server or DNS account, so read the cautions before executing a command.
01 / OWNERGoDaddy DNS
02 / PROOFTemporary TXT
03 / ISSUERLet's Encrypt
04 / RESULTPrivate HTTPS
Critical October 2026 compatibility note. GoDaddy now supports DNS API access with one domain, and its newer Domains v3 API uses Personal Access Tokens (PATs). However, the third-party Certbot GoDaddy plugin documented here still expects a classic key/secret pair. A v3 PAT is not a drop-in replacement. Confirm the classic API method works with your account before depending on this for automatic renewal. If it does not, stop and choose a verified PAT-compatible client or the manual DNS-01 guide for nonautomated issuance. Do not repeatedly attempt production requests.
Who handles each part?
Light violet - GoDaddy DNS adminAuthoritative zone, API access and credential setup.
Light green - Server 01Certificate issuance, Apache and renewal on the first host.
Light blue - Server 02Independent commands for the second private host.
Customize your certificate mission
Change the example labels. Every visible command and challenge hostname will update automatically. Values are not sent to SMORTLER, stored in cookies, or saved in local storage. Do not enter passwords, API keys, private keys, or tokens.
Both servers share a DNS zone, but each issues its own certificate.
Example: example.com - public authoritative DNS must be checked.
Example: lab or office.team. Empty is allowed.
Example: private-01 (one DNS label only).
Example: private-02 on a different Ubuntu machine.
This is not a secret. Required before copying the certificate issuance commands.
SERVER 01 CERTIFICATEprivate-01.lab.example.com
SERVER 01 TXT CHALLENGE_acme-challenge.private-01.lab.example.com
SERVER 02 CERTIFICATEprivate-02.lab.example.com
SERVER 02 TXT CHALLENGE_acme-challenge.private-02.lab.example.com
Example DNS names are valid. Add a real email to enable production/staging certificate command copying.
MISSION 1 / LIGHT VIOLET / DNS ADMIN
GoDaddy - establish the real authority.
Domain registration and DNS hosting are different things. GoDaddy can manage your registration while another provider serves public DNS. The GoDaddy DNS API can only change records in a zone it actually hosts.
01
Confirm the public authoritative DNS zone
From any Linux machine with dig, check which nameservers serve your base domain and where the actual ACME challenge name is delegated. This is read-only.
DNS admin / identify nameservers and challenge zone
dig +short NS example.com
dig +noall +answer +authority SOA _acme-challenge.private-01.lab.example.com
dig @1.1.1.1 _acme-challenge.private-01.lab.example.com SOA +noall +answer +authority
Confirm that the authoritative public zone for the challenge is managed at GoDaddy. An empty TXT lookup before issuance is normal. If DNS is managed at Route 53, Cloudflare, DigitalOcean or elsewhere, use that provider instead.
02
Choose compatible GoDaddy API credentials
GoDaddy announced in April 2026 that one domain is sufficient for its DNS API access. Its newer Domains v3 authentication guidance recommends scoped PATs, while the third-party plugin expects classic credentials. These systems must not be confused.
Confirm that your account can still create and use a classic developer API key and secret for the older plugin.
Verify the DNS zone belongs to the account and that write access is authorized.
Keep the key and secret out of public pages, screenshots, emails and support tickets. Enter them only in a protected file on the private server.
If classic keys or plugin DNS writes no longer work, stop. This guide does not claim to support PAT-based v3 automation.
03
Know the exact temporary record name
For Server 01, the ACME client will create a temporary TXT at _acme-challenge.private-01.lab.example.com. It removes the TXT record after validation. There is no reason to create a permanent challenge TXT record by hand.
Server 02 uses its own record: _acme-challenge.private-02.lab.example.com.
GoDaddy record propagation can take longer than expected. The copyable commands allow 900 seconds, based on the plugin documentation. Production certificate issuance should follow a successful staging test.
MISSION 2 / FIRST PRIVATE SERVER
Server 01 - private-01
Follow this section as root on private-01 only. These examples assume Ubuntu 24.04, Apache, and a new certificate. Do not run these steps on a machine with an existing Certbot setup until you have checked for conflicts.
01
Inspect the machine before making any changes
Check your installed Certbot versions and any existing renewal schedules first. The GoDaddy plugin is third-party software and must be installed with the Certbot executable that actually runs it.
If this host already has Certbot certificates or an automated renewal service, stop and plan how to reuse the existing configuration. This guide does not overwrite existing certificates or blindly add a second scheduler.
02
Install an isolated Certbot + GoDaddy plugin
On a clean host, use a Python virtual environment so the third-party DNS plugin and Certbot run together, without using system-wide pip. This is a dedicated Certbot installation at /opt/certbot-godaddy.
Verify dns-godaddy appears in the plugin list. If installation fails, stop. Never install a Python package into the system interpreter just to force it to work.
03
Create a root-only credentials file
Use a classic GoDaddy developer key and secret compatible with the published third-party plugin - not a v3 Personal Access Token. Do not paste actual credentials into the HowTo page or any chat.
Place the following INI text in the editor. Replace the placeholders on your server with actual credentials. This block is file contents, not a shell command.
This process does not overwrite an existing file. If the credentials file already exists, review its contents and preserve any working integration before making changes.
04
Test DNS-01 against Let's Encrypt staging
This staging run tests GoDaddy API access and public TXT record propagation without issuing a trusted production certificate. GoDaddy propagation can be slow, so this example allows 900 seconds before validation.
If the staging challenge fails, do not issue a production certificate. Inspect API permission errors, whether GoDaddy is the authoritative DNS host, and whether the plugin still supports your credential type.
05
Issue the certificate after the staging test passes
Run the production command once only after the dry run succeeds. The plugin creates and removes the temporary TXT record at _acme-challenge.private-01.lab.example.com. No public inbound port 80 is required for DNS-01 validation.
/opt/certbot-godaddy/bin/certbot certificates
ls -l /etc/letsencrypt/live/private-01.lab.example.com/
Your expected certificate chain is /etc/letsencrypt/live/private-01.lab.example.com/fullchain.pem and private key is /etc/letsencrypt/live/private-01.lab.example.com/privkey.pem. Actual paths are confirmed by certbot certificates.
06
Connect Apache to the certificate you just issued
First inspect your existing Apache virtual hosts. Do not replace a working site configuration with a generic example.
If Apache already serves the site, update its matching HTTPS virtual host to reference the new certificate. For a new site, the following is the relevant portion of the :443 configuration (example only, not a shell command):
Server 01 / Apache SSL directives (example)
ServerName private-01.lab.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/private-01.lab.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/private-01.lab.example.com/privkey.pem
Only reload Apache after configtest reports Syntax OK. Private servers still need working internal DNS, a reachable HTTPS service, and appropriate firewall rules for intended internal clients.
07
Schedule independent certificate renewals
Because this guide uses an isolated venv, the Ubuntu or Snap Certbot timer will not automatically invoke this binary. Set up a dedicated systemd timer on each server. The deploy hook checks Apache before reloading, and it runs only when Certbot reports a successful certificate renewal.
These commands are for one certificate per host using the service name shown. If you have multiple managed certificates on the same host, coordinate one combined renewal strategy instead of overwriting this service. Do not enable duplicate renewal schedulers.
Expected results: staging DNS verification succeeds; the Certbot timer is active; Apache is active; and the certificate paths match the HTTPS virtual host. A dry run tests the renewal mechanism, but ongoing operations should still be monitored.
MISSION 3 / SECOND PRIVATE SERVER
Server 02 - private-02
Follow this section as root on private-02 only. These examples assume Ubuntu 24.04, Apache, and a new certificate. Do not run these steps on a machine with an existing Certbot setup until you have checked for conflicts.
01
Inspect the machine before making any changes
Check your installed Certbot versions and any existing renewal schedules first. The GoDaddy plugin is third-party software and must be installed with the Certbot executable that actually runs it.
If this host already has Certbot certificates or an automated renewal service, stop and plan how to reuse the existing configuration. This guide does not overwrite existing certificates or blindly add a second scheduler.
02
Install an isolated Certbot + GoDaddy plugin
On a clean host, use a Python virtual environment so the third-party DNS plugin and Certbot run together, without using system-wide pip. This is a dedicated Certbot installation at /opt/certbot-godaddy.
Verify dns-godaddy appears in the plugin list. If installation fails, stop. Never install a Python package into the system interpreter just to force it to work.
03
Create a root-only credentials file
Use a classic GoDaddy developer key and secret compatible with the published third-party plugin - not a v3 Personal Access Token. Do not paste actual credentials into the HowTo page or any chat.
Place the following INI text in the editor. Replace the placeholders on your server with actual credentials. This block is file contents, not a shell command.
This process does not overwrite an existing file. If the credentials file already exists, review its contents and preserve any working integration before making changes.
04
Test DNS-01 against Let's Encrypt staging
This staging run tests GoDaddy API access and public TXT record propagation without issuing a trusted production certificate. GoDaddy propagation can be slow, so this example allows 900 seconds before validation.
If the staging challenge fails, do not issue a production certificate. Inspect API permission errors, whether GoDaddy is the authoritative DNS host, and whether the plugin still supports your credential type.
05
Issue the certificate after the staging test passes
Run the production command once only after the dry run succeeds. The plugin creates and removes the temporary TXT record at _acme-challenge.private-02.lab.example.com. No public inbound port 80 is required for DNS-01 validation.
/opt/certbot-godaddy/bin/certbot certificates
ls -l /etc/letsencrypt/live/private-02.lab.example.com/
Your expected certificate chain is /etc/letsencrypt/live/private-02.lab.example.com/fullchain.pem and private key is /etc/letsencrypt/live/private-02.lab.example.com/privkey.pem. Actual paths are confirmed by certbot certificates.
06
Connect Apache to the certificate you just issued
First inspect your existing Apache virtual hosts. Do not replace a working site configuration with a generic example.
If Apache already serves the site, update its matching HTTPS virtual host to reference the new certificate. For a new site, the following is the relevant portion of the :443 configuration (example only, not a shell command):
Server 02 / Apache SSL directives (example)
ServerName private-02.lab.example.com
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/private-02.lab.example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/private-02.lab.example.com/privkey.pem
Only reload Apache after configtest reports Syntax OK. Private servers still need working internal DNS, a reachable HTTPS service, and appropriate firewall rules for intended internal clients.
07
Schedule independent certificate renewals
Because this guide uses an isolated venv, the Ubuntu or Snap Certbot timer will not automatically invoke this binary. Set up a dedicated systemd timer on each server. The deploy hook checks Apache before reloading, and it runs only when Certbot reports a successful certificate renewal.
These commands are for one certificate per host using the service name shown. If you have multiple managed certificates on the same host, coordinate one combined renewal strategy instead of overwriting this service. Do not enable duplicate renewal schedulers.
Expected results: staging DNS verification succeeds; the Certbot timer is active; Apache is active; and the certificate paths match the HTTPS virtual host. A dry run tests the renewal mechanism, but ongoing operations should still be monitored.
FINAL CHECK / VIOLET VALIDATION
Ready for a secure renewal cycle?
Use these checkboxes to track your mission. They stay in this page only and do not represent a remote verification.
Violet's rule: Trust only a tested renewal. A browser padlock checks today's certificate, but a successful staging dry run plus an active timer checks the renewal path. Review certificate expirations and system logs periodically.
TROUBLESHOOTING / SAFE RECOVERY
When the challenge doesn't cooperate
GoDaddy is my registrar, but the DNS records do not change
Use the read-only NS and SOA checks. The relevant publicly delegated DNS zone might be at another provider. Certbot needs authority over the public challenge TXT name, not access to a private internal DNS-only record.
I have a Personal Access Token but the plugin asks for key + secret
They are different authentication methods. GoDaddy Domains v3 requires PATs, but the published third-party Certbot GoDaddy plugin documents classic key/secret configuration. Do not paste a PAT into a classic key field and assume the integration is supported. Use a validated modern authenticator instead.
The plugin cannot be found after installation
Run /opt/certbot-godaddy/bin/certbot plugins. Always use the Certbot executable inside the same Python venv as the plugin. Avoid mixing APT, Snap and venv plugin installations.
GoDaddy API authentication fails (401/403)
Check that your account is eligible, the DNS zone is in the correct account, credentials are compatible with the API endpoint in use, and the account can write DNS. Do not print secrets to logs. If the classic plugin no longer works, stop.
DNS verification times out or TXT is not visible
Check the challenge DNS name, zone delegation, and public resolver answers. The example waits 900 seconds. Avoid hammering production issuance; solve the problem in staging and inspect Certbot logs. After successful validation the temporary TXT will be removed, so its absence afterward is expected.
Apache still serves the old certificate
Use apache2ctl -S to check the matching HTTPS virtual host. Compare its certificate directives to the paths from /opt/certbot-godaddy/bin/certbot certificates. Run apache2ctl configtest before reloading. Verify from an actual HTTPS client using your internal network path.
I have an existing certificate and want to change only its authenticator
This is a new-certificate guide. Do not blindly run a second issuance or write over your renewal configuration. Check the existing certificate name, installation type and renewal hooks first. Our Route 53 guide shows a separate, safer existing-certificate reconfiguration pattern for an AWS-managed authoritative zone.
My account cannot automate DNS with a working plugin
Use manual DNS-01 validation if you can maintain certificates manually, or plan DNS challenge delegation to an API-supported provider. Do not assume a manually issued certificate will renew without a compatible automated authentication hook.
SMORTLER + SI HowTo - Return to the HowTos directory. Written as an educational field guide. No personal credentials or host settings are transmitted or saved by this page.