Deploy targets
All 31 places a certificate can land - Windows roles, web servers, load balancers, firewalls, hypervisors, Kubernetes, Docker and custom scripts - and what each needs.
A deploy target tells the agent what to do with a certificate once it has it. Without one, issuance would leave a certificate sitting in a file nobody reads.
Pick one inline on a certificate job or a certificate policy, or save it as a reusable object under Manage > Deploy Targets and reference it from any number of certificates. A saved target means one copy of an appliance credential instead of one per certificate; editing it changes every certificate that references it at that certificate's next deployment, and deleting one that is still referenced is refused.
Creating a deploy target needs the Admin role
A deploy target can run a reload command or a script as root or LocalSystem on every host it applies to. Configuring one is closer to a code deployment than to a certificate setting. Members can issue and renew certificates using targets that already exist; creating or editing one requires Admin.
The catalogue
31 presets across 7 families. Presets that share a mechanism share a dispatch type and differ only in their defaults and extra fields.
Windows roles
| Preset | What it does |
|---|---|
| Certificate store | Imports into the local machine certificate store. Creates no binding - use it when another process picks the certificate up by thumbprint. This is also what NPS (RADIUS/PEAP), RRAS (IKEv2 VPN) and DirectAccess need: they auto-select a matching certificate from LocalMachine\My by hostname. |
| IIS | Imports into the store and creates or updates the site's HTTPS binding. Also what NDES (SCEP), AD CS Web Enrollment, WSUS, Print Server (Internet Printing) and SCCM/MECM's management and distribution points need - they are all IIS sites underneath, so point the site name at whichever one that role installed under. |
| Exchange | Runs Import-ExchangeCertificate and enables the certificate for the services you select: IIS, SMTP, POP, IMAP. |
| ADFS | Imports into the store, then assigns it in AD FS as service communications, token signing or token decrypting. |
| RDP / RDS listener | Imports into the store and points the Remote Desktop listener at it over WMI. For a standalone session host, not a full RDS deployment. |
| RDS deployment | Runs Set-RDCertificate against a Remote Desktop Services deployment - RD Gateway, RD Web Access, RD Connection Broker (redirector or publishing), or RD Licensing. |
| WinRM (HTTPS listener) | Imports into the store and creates or replaces the WinRM HTTPS listener, so PowerShell remoting over HTTPS picks the new certificate up. |
| SQL Server | Imports into the store and points the Database Engine instance's configuration at it, with options to force encryption and restart the service. |
| Skype for Business / Lync | Runs Import-CsCertificate and Set-CsCertificate for the usages you select. |
| Hyper-V Replica | Imports into the store and configures it as the Replica server's authentication certificate. |
| VMware Horizon Connection Server | Imports into the store with the friendly name vdm, which Horizon requires and which is therefore not configurable, then restarts the Connection Server service. |
| Citrix StoreFront | Imports into the store and creates or updates the IIS HTTPS binding StoreFront serves from, defaulting to Default Web Site. |
Exchange, AD FS, RDS deployment, SQL Server, Skype for Business, Hyper-V Replica, VMware Horizon and Citrix StoreFront all assume the agent runs on that server itself
- for an RDS deployment, on or able to reach the RD Connection Broker - with the relevant management tooling already installed. aethercert installs none of it.
For a multi-server StoreFront group, run Propagate Changes in the StoreFront console on the other nodes yourself. That is server-group topology the agent has no visibility into.
Every preset that imports into a certificate store offers an exportable private key option, for the case where something else has to re-export the key from the store later. It requires the Standard plan.
Why exportable keys are Windows-only
Linux, Kubernetes and appliance targets write or transmit the raw key directly, so exportability is inherent there - there is nothing to opt into. The option exists only where the key is imported into a Windows certificate store, whose default behaviour is to disallow re-exporting it.
Web servers
| Preset | Fields it pre-fills | Mechanism |
|---|---|---|
| NGINX | Reload systemctl reload nginx, nginx.conf path /etc/nginx/nginx.conf | Writes cert, key and chain files, resolves the worker user, grants it read access to the key, then reloads. |
| Apache | Reload systemctl reload apache2 | Writes cert, key and chain files, then runs the reload command. |
| Custom | Nothing | The same file mechanism with your own paths and reload command, for anything else that reads certificates from disk. |
| HAProxy | Reload systemctl reload haproxy | Writes one combined cert+chain+key PEM bundle and applies it through the Runtime API socket when one is given, falling back to a full reload. |
All four accept an optional HTTP-01 webroot, which makes HTTP-01 challenges write into an existing document root instead of the agent binding port 80.
The NGINX preset does one extra thing
It parses the user directive out of nginx.conf to find which OS user the worker
processes run as, and grants that user read access to the private key before reloading.
This matters more than it sounds. NGINX workers almost always run as an unprivileged
user (www-data, nginx). A key written root-only cannot be read by them, so the
reload appears to succeed while NGINX quietly carries on serving the old certificate.
The failure surfaces weeks later, as an expiry.
If the config cannot be read or no user directive is found, the key is left owned by
the agent's own user and a warning is logged. Nothing is guessed. The Custom preset
does not do this - if you use it for NGINX, handle the permissions yourself.
Why HAProxy is its own preset
HAProxy wants the certificate, chain and private key concatenated into one PEM bundle, not separate files. Configure a Runtime API socket and the new certificate is applied through it with no restart; leave it blank and it falls back to the reload command.
Load balancers
| Preset | What it does |
|---|---|
| Citrix NetScaler (Nitro API) | Uploads the certificate and key over the Nitro management API, creates or updates the sslcertkey object, and uploads the issuing chain and links it so the appliance presents the full chain. It does not bind the certkey to an SSL vserver - do that in NetScaler. |
| F5 BIG-IP | Uploads over iControl REST, creates or updates the sys/file/ssl-cert and ssl-key objects, and optionally updates a Client SSL profile to reference them. Partition-aware, defaulting to Common. |
| Kemp / Progress LoadMaster | Uploads a combined cert+key bundle to the certificate store over the management API, then optionally binds it to a named Virtual Service. Leave the Virtual Service blank to bind by hand. |
Firewalls
| Preset | What it does |
|---|---|
| Fortinet FortiGate | Imports the certificate as a FortiOS local certificate over the REST/monitor API, VDOM-aware. Only the leaf is uploaded - if FortiGate has to serve an intermediate chain, import that separately as a CA certificate. |
| Palo Alto Networks (PAN-OS) | Imports the certificate and key over the XML API, then commits and waits for the commit job - PAN-OS requires an explicit commit before an imported certificate takes effect. Use an API key, not a username and password. |
| Cisco Secure Firewall (FMC) | Upserts an Internal Certificate object on a Firepower Management Center. Leave the device list blank to update the object only, or list device UUIDs to also push the change to those managed devices. |
| Sophos Firewall | Uploads over the SFOS XML API. The host must include the API port - Sophos's own examples use :4444. |
| WatchGuard Firebox | Imports and installs over WatchGuard Cloud's REST API. Works only for a Firebox fully managed through WatchGuard Cloud, not one it merely monitors. Requires Fireware 12.5.7 or newer, and the API base URL depends on your account's data region. |
Sophos: enable the API first
Sophos Firewall's API is disabled by default. Enable it under WebAdmin > Backup & firmware > API and allow-list the address your agent connects from. A certificate currently bound to a running service also cannot be replaced through the API - unbind it in WebAdmin first.
WatchGuard installs asynchronously
WatchGuard does not document a way to confirm on-device completion, so a successful job here confirms that the install was submitted, not that it finished. Certificate names are capped at 58 characters.
Hypervisors and virtualization
| Preset | What it does |
|---|---|
| VMware vCenter Server | Replaces vCenter's own Machine SSL certificate - what a browser or API client sees connecting to vCenter - over the vSphere Automation REST API. Does not touch individual ESXi hosts' certificates. |
| Nutanix Prism | Imports into Prism Central or Element over its certificate-management API. The key type is detected from the issued certificate. |
| Proxmox VE | Uploads a custom certificate to a node over the REST API using an API token, then restarts pveproxy so it takes effect immediately. |
VMware Horizon is filed under Windows roles rather than here: replacing its certificate is a Windows certificate-store operation, not a vSphere API call.
DevOps and orchestration
| Preset | What it does |
|---|---|
| Kubernetes | Creates or updates a kubernetes.io/tls Secret through the cluster API server directly - no kubectl or cluster tooling on the agent host. Optionally rolls named Deployments in the same namespace afterwards, since most workloads only read a mounted Secret at pod start. |
| Docker container | Copies the certificate, key and chain into a running container through the Docker Engine API - not the docker CLI - then either runs a reload command inside it or restarts it. Paths are inside the container. |
Authenticate Kubernetes with a least-privilege ServiceAccount token scoped to the one
namespace and Secret it needs, never a cluster-admin credential. The Docker target needs
the agent's service account to reach the local socket or named pipe, equivalent to
docker group membership on Linux.
Custom scripts
Available on both Windows and Linux, for anything the presets do not cover. It runs a
script that already exists on the agent host and passes your own variables as
environment variables named AC_VAR_<NAME>.
| Field | Notes |
|---|---|
| Script filename | A bare filename, never a path. .sh on Linux, .ps1 on Windows. |
| Variables | Up to 25, each value up to 4096 characters. Names must match [A-Z][A-Z0-9_]{0,63}. Flag one secret and its value goes to Vault and is never shown again. |
Before a script runs it has to pass four checks, and none of them is skippable:
- The name resolves inside the agent's scripts directory, with no traversal and no symlink escape.
- It is a regular file.
- It is not group- or world-writable.
- It is owned by root.
Execution is bounded at 60 seconds. The script is run with real argv -
exec(scriptPath) on Linux, powershell.exe -File <script> on Windows - never through
a shell string, so nothing in a variable's value can inject a command. Its environment
is built from scratch rather than inherited: PATH, HOME and LANG on Linux,
SystemRoot, windir, PATH and ComSpec on Windows, plus your AC_VAR_* entries.
A variable named PATH becomes AC_VAR_PATH, so it cannot shadow anything; a short
list of names is refused outright as a guard against typos.
Its exit code and the tail of its output are recorded on the job.
The script does not receive the certificate
A custom-script target runs your hook. It does not write the certificate, the chain or the key anywhere first, and it passes no certificate paths - only your variables reach the script's environment. If the script needs the material, give the certificate a second deploy target that writes it to disk, or have the script fetch it from wherever your environment keeps it.
Script content is never uploaded
The dashboard only ever selects a script by filename. You place it yourself under the
agent's scripts directory - /etc/aethercert-agent/agent/scripts/ on Linux,
C:\ProgramData\aethercert\agent\scripts\ on Windows.
This is the single most important boundary in the product: the dashboard is never a channel for pushing new code onto your infrastructure. A compromised account can at most change which already-approved script runs, and with what variables. It cannot introduce script content.
Placeholders in target fields
Any text field on a deploy target - a file path, a script filename, a certificate object
name, a custom script variable - can use {{hostname}}, {{hostname_short}} or
{{agent_name}}. They are resolved against whichever agent the job is dispatched to,
immediately before it is sent.
These are more permissive than the same placeholders in a
certificate policy's common name: they are
not restricted to hostname-safe characters, and an unknown {{...}} is left in place
rather than rejected. That makes them usable for a per-host script argument or an object
name that should vary by agent.
What each target needs
| Target | Requirement |
|---|---|
| Windows store, IIS, RDP, WinRM | Local administrator on the agent host |
| Exchange | Agent on the Exchange server, Exchange Management Shell present |
| AD FS | Agent on the AD FS server, AD FS PowerShell module present |
| RDS deployment | Agent on or able to reach the RD Connection Broker, RemoteDesktop PowerShell module present |
| SQL Server | Agent on the SQL Server host |
| Skype for Business / Lync | Agent on the front-end server, Management Shell present |
| Hyper-V Replica | Agent on the Hyper-V host |
| VMware Horizon | Agent on the Connection Server itself |
| Citrix StoreFront | Agent on the StoreFront server itself |
| NGINX, Apache, Custom, HAProxy | Write access to the configured paths, and permission to run the reload command |
| Every appliance and API target | Network reach to the management endpoint, and API credentials that may manage certificates |
| Kubernetes | Network reach to the cluster API server, and a ServiceAccount token scoped to the target namespace |
| Docker | Access to the Docker socket or named pipe |
| Custom script | The script already present in the agent's scripts directory, root-owned and not group- or world-writable |
An agent runs one operating system, so a Linux agent cannot carry out a Windows-only preset and vice versa. Targets that talk to a remote API work from either. The certificate form filters the list accordingly, and a policy reports a member whose OS cannot run its target as not applied rather than failing the job.
How deployments behave
Every deployment is idempotent. Running the same target twice with the same certificate converges on the same end state rather than accumulating duplicates. File targets overwrite in place; API targets that create named objects upsert them; Windows store imports tag what they create and clean up the previous entry after the new one is confirmed, so a cleanup failure leaves a stale entry rather than no certificate.
Rolling back is redeploying. Because deployment is idempotent, the undo for a bad certificate is deploying the previous one again - the agent caches the material for exactly that. Only Kubernetes implements a real removal, because deleting a Secret is genuinely different from replacing its contents.
Failures are classified. A deploy error the connector recognises as permanent - bad credentials, an object name the target does not know, a request it rejected outright - stops the job immediately instead of burning its remaining retries on an identical failure. Connection refused, a timeout or a 5xx is temporary and retried; an explicit rate limit schedules the next attempt. An error a connector cannot classify is treated as retryable.
TLS to a management endpoint requires TLS 1.2 or newer. Each appliance preset has its own allow self-signed TLS checkbox, which is the only way to lower that for one target. Some appliance management planes are still TLS 1.0 or 1.1 only, where the handshake fails before certificate verification is even reached.
Private keys are written 0600 inside a 0700 directory. The NGINX target widens
read access to exactly one resolved user - never to a group, never to world.
Verification status
Every deploy target is implemented against its vendor's own documented API or management tooling. Most have not been exercised against real infrastructure of that type. Validate a new target in a staging environment before relying on it for a production renewal.
| Confidence | Targets |
|---|---|
| Exercised | linux_file (Apache, Custom), nginx, docker, windows_store (Certificate store, IIS), netscaler, kubernetes |
| Implemented from vendor documentation, unverified against hardware | Exchange, AD FS, RDP, RDS deployment, WinRM, SQL Server, Skype for Business, Hyper-V Replica, Horizon, StoreFront, HAProxy, F5, Kemp, FortiGate, Palo Alto, Cisco FMC, vCenter, Nutanix, Proxmox |
| Verify first - the vendor's own documentation left gaps | Sophos Firewall, WatchGuard Firebox |
For the two in the last row, the vendors publish no example success or error response for the operations involved. Both connectors read their target's response defensively; a failure there is more likely to need a look at the appliance than at aethercert. If a target behaves unexpectedly, include the job's ID when you contact support.
Agent groups
Group agents so one certificate job can target all of them, and so a certificate policy has something to apply to - membership, effects, and when to use one.
Organizations
The tenant boundary in aethercert: creating one, switching between them, the organization settings pages, billing, and deleting one.