Tutorial: Issue Let's Encrypt SSL Certificates via the Access Server Web API, Including IP Address Certificates
Use the Access Server Web API to install a Let's Encrypt SSL certificate via sacli apicall — covers domain (FQDN) and IP address certificates, with automatic renewal. IP address certificates enable browser-trusted connections without a domain name.
Overview
This tutorial shows you how to use the Access Server Web API to request, install, and verify a browser-trusted Let’s Encrypt SSL certificate for the Admin Web UI and Client Web UI.
You can issue a certificate for either:
A fully qualified domain name (FQDN), such as
vpn.example.com.A public IP address, which lets you use a browser-trusted certificate without a domain name.
Access Server uses the ACME protocol to request the certificate from Let’s Encrypt. After you configure ACME, the Access Server ACME client also manages automatic renewal.
This tutorial demonstrates the Web API workflow by running requests locally with the sacli apicall command. You can also call the same Web API endpoints using cURL or the embedded Swagger UI. Refer to Tutorial: Test the New Web API (OpenAPI) in Access Server 3.0 for examples of each method.
Related certificate tutorials
Choose another method if it better fits your deployment:
Standard
sacliACME workflow: Tutorial: How to Use ACME Client to Issue Web SSL Certificates for the Access Server UI.Certbot, including wildcard certificates: Tutorial: Install a Let's Encrypt Wildcard SSL Certificate on Access Server with Certbot.
Other ACME certificate authorities: Tutorial: Install Web SSL Certificates on Access Server Using Google Trust Services, ZeroSSL, SSL.com, or Actalis.
Browser-trusted certificates also provide the trusted HTTPS foundation used in Zero Trust Network Access deployments.
Prerequisites
Before you begin, ensure you have:
Access Server 3.1.0 or newer.
Console access and the ability to get root access.
Outbound access to TCP port 443.
A public IP address assigned to Access Server.
For an FQDN certificate, a domain name that resolves to the Access Server public IP address.
Optional: A remote computer if you want to run Web API requests with cURL or Swagger UI instead of
sacli apicall.
Review the SSL Certificates reference for background information about web SSL certificates in Access Server.
Note
Web SSL certificates secure the Admin Web UI and Client Web UI. They are separate from the certificates Access Server uses for VPN connections. Replacing the web certificate doesn’t change VPN certificates.
Manually installed certificates
Don’t use the ACME client if you plan to manage a web SSL certificate manually through a third-party certificate authority.
If ACME remains enabled, Access Server can replace the manually installed certificate during the next automatic renewal.
To disable ACME:
Connect to the console and get root privileges.
Run:
sacli --key "acme.enable" --value "false" ConfigPut
Restart Access Server:
sacli start
Placeholder values
Replace the following placeholder values with values for your environment:
Placeholder | Description |
|---|---|
| Access Server fully qualified domain name |
| Access Server public IP address |
Certificate profiles, validity, and renewal
Let’s Encrypt supports different certificate profiles with different validity periods.
The default certificate profile issues certificates that are valid for 90 days. Access Server begins automatic renewal after 60 days.
The
shortlivedcertificate profile issues certificates that are valid for 160 hours, or approximately 6.7 days. Access Server begins automatic renewal after 3 days.
The shortlived profile is required when requesting a Let’s Encrypt IP address certificate. You can also use the shortlived profile when requesting a certificate for a domain name.
Choose a certificate type
Choose the procedure that matches how users access your Access Server web interfaces.
Use an FQDN certificate when users open Access Server with a hostname such as:
https://vpn.example.com
Continue to Issue an SSL certificate for FQDN.
Use an IP address certificate when users open Access Server directly with its public IP address, such as:
https://203.0.113.5
This provides a browser-trusted certificate without a domain name.
Continue to Issue an SSL certificate for an IP address.
Issue an SSL certificate for FQDN
The Access Server ACME client uses Let’s Encrypt by default.
For domain validation, it uses the TLS-ALPN-01 challenge, which validates control of the domain over TLS port 443 without requiring port 80.
TLS-ALPN-01 doesn’t support wildcard certificates. If you need a wildcard certificate, use the Certbot tutorial instead.
Connect to the console and get root privileges.
Configure the FQDN that should receive the certificate:
sacli --method POST --url 'api/config-items/Default' --value '{"acme.domains.0": "<ACCESS_SERVER_DOMAIN>"}' apicallA successful request returns:
null
Restart Access Server services:
sacli --method POST --url 'api/server/restart?restartMode=warm' --value '' apicall
Example output:
{}
Register an account with the ACME CA:
sacli --method POST --url 'api/acme/register-account' --value '{}' apicallExample output:
{"account":"https://acme-v02.api.letsencrypt.org/acme/acct/3570987755"}
Confirm the response contains an ACME account URL.
Request the certificate:
sacli --method POST --url 'api/acme/request-certificate' --value '{}' apicallWait for Access Server to complete the ACME validation.
Confirm that the command completes without an error.
Example output:
null
Access Server requests and installs the Let's Encrypt certificate for the configured FQDN.
Continue to Verify an FQDN certificate.
Verify an FQDN certificate
Verify the installed certificate from the browser and Admin Web UI. You can also verify it with the Web API or command-line tools.
Open the Admin Web UI using the configured hostname:
https://<ACCESS_SERVER_DOMAIN>/admin
Open the Client Web UI:
https://<ACCESS_SERVER_DOMAIN>
Confirm that the browser no longer displays a self-signed certificate warning.
Open the browser's certificate or site information panel.
Confirm that:
The certificate hostname matches the Access Server FQDN.
Let's Encrypt issued the certificate.
The certificate is within its validity period.
The browser trusts the certificate chain.
Note
Browser interfaces vary. Depending on the browser, certificate and connection details may appear under a lock, tune, shield, or site information icon.
Sign in to the Admin Web UI.
Navigate to Certificate Management.
Select the Web Server Certificate tab.
Confirm that the expected certificate appears.
Select See full certificate details, if needed.
Verify:
Subject.
Issuer.
Expiration date.
Connect to the console and get root privileges.
Verify via
apicall:sacli --method POST --url 'api/certificate/info' --value "{\"certificate\": \"$(sacli ConfigQuery|grep cs.cert|cut -d '"' -f 4)\"}" apicallExample output:
{"serial":"506116826303089592917918274713470173092603","common_name":"<ACCESS_SERVER_DOMAIN>","algorithm":"secp384r1","not_before":"2026-07-26T14:26:50Z","not_after":"2026-10-24T14:26:49Z","self_signed":false,"sha256fp":"10:9b:5f:50:a6:85:ab:b4:94:bb:71:58:13:da:18:6b:80:0c:2a:f8:07:bf:a3:94:7e:c4:63:95:c7:28:e7:8d","subject":["CN=<ACCESS_SERVER_DOMAIN>"],"issuer":["CN=YE1","O=Let's Encrypt","C=US"],"subj_alt_names":["DNS:<ACCESS_SERVER_DOMAIN>"],"ca":false}
Confirm that:
self_signedisfalse.The issuer is Let's Encrypt.
The certificate is within its validity period.
subj_alt_namescontains the expected DNS hostname.
Verify with OpenSSL:
sacli ConfigQuery|grep cs.cert|cut -d '"' -f 4|sed 's/\\n/\n/g'|openssl x509 -text -noout|head -n 11
Example output:
Certificate: Data: Version: 3 (0x2) Serial Number: 05:cf:57:fb:1d:10:a7:56:9f:d6:a1:97:75:e9:80:66:9a:fb Signature Algorithm: ecdsa-with-SHA384 Issuer: C = US, O = Let's Encrypt, CN = YE1 Validity Not Before: Jul 26 14:26:50 2026 GMT Not After : Oct 24 14:26:49 2026 GMT Subject: CN = <ACCESS_SERVER_DOMAIN>
Confirm the issuer, validity period, and subject.
Expected result: The Admin Web UI and Client Web UI present a browser-trusted Let’s Encrypt certificate for the configured FQDN.
Issue an SSL certificate for an IP address
Let’s Encrypt supports IP address certificates, allowing Access Server to present a browser-trusted certificate without a domain name.
IP address certificates are valid for 160 hours, or just over 6 days, rather than the 90-day validity period used for standard domain certificates.
They use Let's Encrypt's shortlived certificate profile.
Note
The shortlived profile is required for IP address certificates, which have a 160-hour validity period. Because these certificates expire quickly, Access Server begins automatic renewal after 3 days.
Connect to the console and get root privileges.
Configure the public IP address that should receive the certificate:
sacli --method POST --url 'api/config-items/Default' --value '{"acme.ip_addresses.0": "<ACCESS_SERVER_IP>"}' apicallA successful request returns:
null
Configure the certificate profile for IP certificates:
sacli --method POST --url 'api/config-items/Default' --value '{"acme.cert_profile": "shortlived"}' apicallA successful request returns:
null
Restart Access Server services:
sacli --method POST --url 'api/server/restart?restartMode=warm' --value '' apicall
Example output:
{}
Register an account with the ACME CA:
sacli --method POST --url 'api/acme/register-account' --value '{}' apicallExample output:
{"account":"https://acme-v02.api.letsencrypt.org/acme/acct/3570987755"}
Confirm the response contains an ACME account URL.
Request the certificate:
sacli --method POST --url 'api/acme/request-certificate' --value '{}' apicallWait for Access Server to complete the ACME validation.
Confirm that the command completes without an error.
Example output:
null
Access Server requests and installs the Let's Encrypt IP address certificate.
Continue to Verify an IP address certificate.
Verify an IP address certificate
For an IP address certificate, verify that the IP address appears in the certificate’s Subject Alternative Name (SAN).
Unlike many domain certificates, an IP address certificate may not have a Common Name value.
Open the Admin Web UI using the configured hostname:
https://<ACCESS_SERVER_IP>/admin
Open the Client Web UI:
https://<ACCESS_SERVER_IP>
Confirm that the browser no longer displays a self-signed certificate warning.
Open the browser's certificate or site information panel.
Confirm that:
The certificate covers the Access Server IP address.
Let's Encrypt issued the certificate.
The certificate is within its validity period.
The browser trusts the certificate chain.
Note
Browser interfaces vary. Depending on the browser, certificate and connection details may appear under a lock, tune, shield, or site information icon.
Sign in to the Admin Web UI.
Navigate to Certificate Management.
Select the Web Server Certificate tab.
Confirm that the expected certificate appears.
Select See full certificate details, if needed.
Verify:
Subject.
Issuer.
Expiration date.
Connect to the console and get root privileges.
Verify via
apicall:sacli --method POST --url 'api/certificate/info' --value "{\"certificate\": \"$(sacli ConfigQuery|grep cs.cert|cut -d '"' -f 4)\"}" apicallExample output:
{"serial":"534506998025996180192364413873987588486223","common_name":null,"algorithm":"secp384r1","not_before":"2026-07-26T14:41:47Z","not_after":"2026-08-02T06:41:46Z","self_signed":false,"sha256fp":"c7:86:0a:26:f4:89:55:d0:1a:14:73:8f:94:ce:8a:91:d0:50:17:d4:8b:cf:e9:a5:fc:ea:89:54:5e:d0:09:5f","subject":[],"issuer":["CN=YE2","O=Let's Encrypt","C=US"],"subj_alt_names":["IP:<ACCESS_SERVER_IP>"],"ca":false}
Confirm that:
self_signedisfalse.The issuer is Let's Encrypt.
The certificate is within its validity period.
subj_alt_namescontains the expected IP address.
Verify with OpenSSL:
sacli ConfigQuery|grep cs.cert|cut -d '"' -f 4|sed 's/\\n/\n/g'|openssl x509 -noout -ext subjectAltName
Example output:
X509v3 Subject Alternative Name: critical IP Address:<ACCESS_SERVER_IP>
Confirm the IP address appears under
SubjectAltName.
Expected result: The Admin Web UI and Client Web UI present a browser-trusted Let’s Encrypt certificate for the configured IP address.
Automatic renewal
After ACME is configured, Access Server manages automatic certificate renewal.
Access Server begins renewal after 60 days for the 90-day certificate.
To maintain successful renewal:
Keep the FQDN pointed to the correct Access Server IP address.
Keep the required ACME validation path available.
Don’t replace the ACME-managed certificate manually.
Review Access Server logs if the certificate approaches expiration without renewing.
Access Server begins renewal after 3 days because the shortlived certificate is valid for only 160 hours.
To maintain successful renewal:
Keep the certified public IP address assigned to Access Server.
Ensure the ACME validation requirements remain satisfied.
Don’t disable the ACME client.
Monitor certificate expiration closely if you change networking, firewalls, or public IP addresses.
Troubleshooting
Confirm that Access Server can reach the ACME service.
Confirm that the configured FQDN or IP address is correct.
Confirm that the appropriate validation traffic can reach Access Server.
Confirm that the ACME account was registered successfully.
Review the output from the
api/acme/request-certificateWeb API call.Review the Access Server logs for ACME-related errors.
For an FQDN certificate:
Open Access Server using the configured hostname rather than its IP address.
Verify that the hostname appears in the certificate Subject Alternative Name.
Confirm that the certificate is within its validity period.
Confirm that the certificate isn’t self-signed.
For an IP address certificate:
Open Access Server using the exact IP address included in the certificate.
Verify that the IP address appears in the certificate Subject Alternative Name.
Confirm that the short-lived certificate hasn’t expired.
Confirm that automatic renewal has completed successfully.
See also
Tutorial: How to Use ACME Client to Issue Web SSL Certificates for the Access Server UI
Tutorial: Install a Let's Encrypt Wildcard SSL Certificate on Access Server with Certbot
Tutorial: How to Use ACME Client to Issue Web SSL Certificates for the Access Server UI
Tutorial: Test the New Web API (OpenAPI) in Access Server 3.0