SSL / TLS
Free, automatic SSL/TLS certificate provisioning and renewal via Let's Encrypt ACME HTTP-01. Zero-config HTTPS for all domains on Lumos Gate.
Overview
Lumos Gate provides fully automatic SSL certificate management through Let's Encrypt. When you enable SSL on a domain, the agent running on your shield server provisions a trusted certificate using the ACME HTTP-01 challenge, configures HAProxy to serve HTTPS, and handles renewals automatically. No manual certificate management, no configuration files to edit, no expiry surprises.
SSL is free for all plans and there is no limit on the number of certificates you can provision.
How It Works
The SSL provisioning flow:
- You enable the SSL toggle for a domain in the dashboard (or set
ssl_enabled: truevia the API). - The config change is pushed to the agent via the real-time pipeline (Dashboard -> WebSocket Server -> Agent).
- The agent sets the domain's SSL status to Provisioning and reports this to the dashboard.
- The agent initiates an ACME HTTP-01 challenge with Let's Encrypt.
- Let's Encrypt sends an HTTP request to
http://yourdomain.com/.well-known/acme-challenge/<token>to verify ownership. - The agent responds to the challenge on port 80, receives the certificate, and stores it on disk.
- HAProxy is reloaded with the new certificate active.
- All HTTP traffic for that domain is automatically redirected to HTTPS via a 301 redirect.
The entire process typically completes in 10-30 seconds.
Dashboard (SSL toggle ON)
|
v
WebSocket Server -> Agent
|
v
Agent sets status = "provisioning"
|
v
ACME HTTP-01 challenge initiated
|
v
Let's Encrypt verifies http://domain/.well-known/acme-challenge/
|
v
Certificate issued and stored at /etc/letsencrypt/live/<domain>/
|
v
HAProxy reloaded with certificate
|
v
HTTPS active, HTTP -> HTTPS 301 redirect enabledPrerequisites
Before enabling SSL on a domain, make sure all of the following conditions are met:
1. DNS Must Point to the Shield VPS
The ACME HTTP-01 challenge requires Let's Encrypt to reach your shield server by making an HTTP request to your domain on port 80. If DNS is not pointing to the shield VPS IP, the challenge will fail because the request will go to the wrong server.
See the DNS Setup guide for step-by-step instructions on configuring your DNS records.
How to verify:
dig +short yourdomain.com
# Expected output: your shield VPS IP address
# Example: 203.0.113.10If the output shows your origin IP or a different address, update your DNS before enabling SSL.
2. Port 80 Must Be Open
The HTTP-01 challenge uses port 80 to verify domain ownership. HAProxy listens on port 80 by default after the agent is installed, so this should already be the case. However, if you have a host-level firewall (iptables, ufw, or cloud provider security group), make sure port 80 is allowed for inbound TCP traffic.
How to verify from another machine:
curl -v http://yourdomain.com
# Should connect (even if it returns a 503 or redirect, the connection itself must succeed)3. Domain Must Be Added to Lumos
The domain needs to exist in your Lumos dashboard with at least one origin server configured. SSL cannot be enabled on a domain that has not been created yet.
4. Cloudflare Proxy Must Be Disabled
If you use Cloudflare for DNS, the Cloudflare proxy (orange cloud) must be turned off for the domain. Cloudflare's proxy intercepts the ACME challenge request and prevents it from reaching your shield VPS. Set the record to DNS only (grey cloud). See the Cloudflare section of the DNS Setup guide for details.
Warning: If you are migrating from another provider, update your DNS records first and wait for propagation (verify with
dig) before enabling SSL. Attempting to provision a certificate before DNS has propagated will result in a failed challenge.
Enabling SSL
- Navigate to Dashboard -> Domains.
- Select the domain you want to secure.
- Toggle the SSL switch to enabled.
- The status will show Provisioning while the certificate is being issued (typically 10-30 seconds).
- Once complete, the status changes to Active with the certificate expiry date displayed.
No other configuration is needed. The agent handles the entire ACME flow, certificate storage, HAProxy configuration, and HTTPS redirect setup automatically.
Disabling SSL
To disable SSL on a domain:
- Navigate to the domain details page.
- Toggle the SSL switch to disabled.
- The config push removes the HTTPS binding from HAProxy.
- Traffic will be served over HTTP only.
The certificate files remain on disk at /etc/letsencrypt/live/<domain>/ but are no longer referenced by HAProxy. If you re-enable SSL later, a new certificate will be provisioned (the old files are not reused).
Provisioning States
The SSL status for each domain follows this lifecycle:
| Status | Description |
|---|---|
| Disabled | SSL is not enabled for this domain. Traffic served over HTTP only. |
| Provisioning | The agent is actively requesting a certificate from Let's Encrypt. This typically takes 10-30 seconds. The agent reports this status immediately before starting the ACME flow, so you see real-time feedback in the dashboard. |
| Active | A valid certificate is installed and serving HTTPS traffic. The certificate expiry date is displayed alongside this status. |
| Failed | Certificate provisioning failed. Check the troubleshooting section below for common causes and solutions. |
The status transitions:
Disabled -> Provisioning -> Active (success)
\-> Failed (error)HTTPS Redirect
When SSL is active on a domain, HAProxy automatically redirects all HTTP (port 80) traffic to HTTPS (port 443). This is handled at the proxy level by HAProxy, so your origin server does not need any redirect configuration.
The redirect uses a 301 Moved Permanently status code, which browsers and search engines cache. This ensures:
- All traffic is encrypted without any additional setup on your end
- Search engines index the HTTPS version of your pages
- Users who bookmark or type
http://are automatically sent tohttps://
Note: The ACME HTTP-01 challenge path (
/.well-known/acme-challenge/) is excluded from the redirect during certificate provisioning and renewal. This is handled automatically by the agent.
Auto-Renewal
Let's Encrypt certificates are valid for 90 days. The Lumos agent handles renewal automatically:
- Certificates are renewed 30 days before expiry (at the 60-day mark).
- Renewal uses the same ACME HTTP-01 process -- no downtime, no manual intervention.
- If renewal fails, it retries automatically on subsequent attempts.
- When a certificate is successfully renewed, the agent sends an
ssl_renewedstatus message to the dashboard. - The WebSocket server's health check (running every 5 minutes) checks SSL expiry dates.
- The dashboard sends an
ssl_expiringnotification 7 days before expiry if a certificate has not been renewed, giving you time to investigate.
Warning: If your shield VPS is offline or unreachable when renewal is due, the certificate cannot be renewed. Make sure your shield servers stay online and connected to the Lumos WebSocket server. If a server goes offline, you will receive a
server_downnotification to alert you.
Renewal Timeline
| Days Until Expiry | Action |
|---|---|
| 30 | Agent attempts automatic renewal |
| 7 | Dashboard sends ssl_expiring notification if not renewed |
| 0 | Certificate expires -- HTTPS connections will show browser warnings |
Dashboard Monitoring
The domain detail page shows the current SSL status for each domain:
- Certificate expiry date -- When the current certificate expires (90 days from issuance)
- Provisioning status -- Real-time status updates during initial provisioning
- Expiry warnings -- Visual warning indicator when a certificate is within 7 days of expiry
Notification Alerts
You can configure notification alerts for SSL events in Dashboard -> Settings -> Notifications:
| Event | Trigger | Default |
|---|---|---|
ssl_expiring | Certificate is within 7 days of expiry and has not been renewed | |
ssl_renewed | Certificate was successfully renewed by the agent |
Notifications can be delivered via email and/or webhook. See the Notifications page for configuration details.
Certificate Storage
Certificates are stored on each shield VPS at:
/etc/letsencrypt/live/<domain>/
fullchain.pem # Certificate + intermediate chain
privkey.pem # Private keyHAProxy is configured to use these certificate files. The agent manages the symlinks and file paths automatically -- you should not need to touch these files manually.
Warning: Do not manually modify or delete certificate files. The agent manages the certificate lifecycle. Manual changes may be overwritten on the next config push or renewal.
Troubleshooting
Certificate provisioning stuck on "Provisioning"
This usually means the ACME challenge is failing silently. Check the following:
-
Verify DNS points to the shield VPS:
dig +short yourdomain.com # Must return your shield VPS IP, e.g., 203.0.113.10 -
Ensure port 80 is open on the shield VPS:
curl -v http://yourdomain.com # Connection must succeed (any HTTP response is fine) -
Check that the agent is connected: The server should show "Online" status in the dashboard (Dashboard -> Servers). If it shows "Offline", the agent is not connected and cannot receive the SSL config push.
-
Check for Cloudflare proxy: If using Cloudflare, make sure the proxy (orange cloud) is disabled. The record must show a grey cloud (DNS only). See DNS Setup.
Certificate provisioning failed
Common causes:
- Let's Encrypt rate limits: Let's Encrypt allows a maximum of 50 certificates per registered domain per week. If you are testing repeatedly with the same domain, you may hit this limit. Wait a week or use a different subdomain for testing.
- DNS not propagated: The domain must resolve to the shield VPS IP globally, not just from your local DNS. Use
dig @8.8.8.8 yourdomain.com +shortto check from Google's DNS. - Cloudflare proxy enabled: Cloudflare intercepts HTTP requests when the proxy (orange cloud) is active, preventing the ACME challenge from reaching the agent.
- Port 80 blocked: A firewall, security group, or the VPS provider may be blocking inbound port 80. Check with your VPS provider.
HTTPS not working after enabling SSL
- Allow time: Give 30 seconds for the certificate to be provisioned and HAProxy to reload.
- Clear browser cache: Browsers aggressively cache redirect and certificate information. Try an incognito/private window.
- Verify with curl:
curl -vI https://yourdomain.com # Look for "SSL certificate verify ok" in the output - Check certificate details:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null | openssl x509 -noout -dates # Shows notBefore and notAfter dates
Certificate renewal failed
- Ensure the shield VPS is online and the agent is connected (check Dashboard -> Servers for "Online" status).
- Verify port 80 is still open -- some VPS providers reset firewall rules after reboots.
- Check that DNS still points to the shield VPS (DNS records may have been changed accidentally).
- If the agent was offline during the renewal window, it will retry automatically once it reconnects.
"Too many certificates" error
Let's Encrypt enforces rate limits. If you see this error:
- You have issued too many certificates for the same domain in a short period.
- Wait one week for the rate limit to reset.
- For testing, use Let's Encrypt's staging environment (not currently exposed in the Lumos dashboard -- this is a future feature).
Multiple Shield Servers
If a domain is assigned to multiple shield servers, the SSL certificate is provisioned independently on each server. Each agent runs its own ACME challenge and maintains its own certificate copy. This means:
- No shared storage needed -- There is no need for shared certificate storage or a central certificate authority between servers.
- Independent renewal -- Each server can independently renew its certificate on its own schedule.
- Fault isolation -- If one server goes down, others continue serving HTTPS without interruption. The downed server will renew its certificate when it comes back online.
- Identical certificates -- While each server provisions separately, Let's Encrypt will issue functionally identical certificates (same domain, same trust chain) to each server.
Note: When using DNS failover, only the server currently receiving traffic needs a valid certificate. However, it is best practice to keep certificates active on all assigned servers so failover transitions are seamless.
SSL with WAF
SSL and WAF features work together seamlessly:
- HAProxy terminates SSL at the shield VPS, then applies WAF rules (IP blacklist, rate limiting, bot protection) to the decrypted traffic.
- This means WAF rules can inspect HTTP headers, request bodies, and other Layer 7 content even for HTTPS traffic.
- The bot protection JS challenge is served over HTTPS when SSL is active.
SSL with WireGuard
If you use a WireGuard tunnel between the shield VPS and origin, the full traffic path is:
User -> HTTPS -> Shield VPS (SSL termination) -> WireGuard tunnel -> OriginSSL is terminated at the shield VPS. Traffic between the shield and origin travels over the encrypted WireGuard tunnel, so it does not need to be HTTPS on the origin side. You can point the origin to an HTTP port (e.g., 10.0.0.2:80), keeping your origin configuration simple.
TLS Versions & Ciphers
HAProxy handles TLS termination on the shield VPS. The agent configures HAProxy with a modern TLS setup automatically -- no manual cipher configuration is needed.
| Setting | Value |
|---|---|
| Minimum TLS version | TLS 1.2 |
| Supported versions | TLS 1.2 and TLS 1.3 |
| Cipher suite | Modern defaults configured by the agent (ECDHE + AES-GCM, ChaCha20-Poly1305) |
| Rejected | TLS 1.0 and TLS 1.1 connections are refused |
Clients using TLS 1.0 or 1.1 (very old browsers, legacy systems) will fail to connect. This is intentional -- TLS 1.0 and 1.1 are deprecated and have known vulnerabilities. All modern browsers and HTTP clients support TLS 1.2 or higher.
The cipher suite and TLS configuration are managed entirely by the agent when it generates the HAProxy config. There is no dashboard setting to change cipher preferences. If you have specific compliance requirements (e.g., TLS 1.3 only), contact support for Enterprise plan options.
Next Steps
- DNS Setup -- Required before enabling SSL; configure DNS records to point to the shield VPS
- Domain Management -- Add and manage domains where SSL is applied
- Notifications -- Configure alerts for SSL expiry warnings and renewal events
- Failover -- Automatic DNS failover keeps HTTPS available even if a shield goes down
- Multiple Servers -- SSL on multi-server domain assignments
- WAF -- Firewall rules that work alongside SSL
- WireGuard -- Encrypt the shield-to-origin connection
- Troubleshooting -- General troubleshooting guide for common issues