aethercert
Documentation

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

PresetWhat it does
Certificate storeImports 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.
IISImports 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.
ExchangeRuns Import-ExchangeCertificate and enables the certificate for the services you select: IIS, SMTP, POP, IMAP.
ADFSImports into the store, then assigns it in AD FS as service communications, token signing or token decrypting.
RDP / RDS listenerImports into the store and points the Remote Desktop listener at it over WMI. For a standalone session host, not a full RDS deployment.
RDS deploymentRuns 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 ServerImports 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 / LyncRuns Import-CsCertificate and Set-CsCertificate for the usages you select.
Hyper-V ReplicaImports into the store and configures it as the Replica server's authentication certificate.
VMware Horizon Connection ServerImports into the store with the friendly name vdm, which Horizon requires and which is therefore not configurable, then restarts the Connection Server service.
Citrix StoreFrontImports 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

PresetFields it pre-fillsMechanism
NGINXReload systemctl reload nginx, nginx.conf path /etc/nginx/nginx.confWrites cert, key and chain files, resolves the worker user, grants it read access to the key, then reloads.
ApacheReload systemctl reload apache2Writes cert, key and chain files, then runs the reload command.
CustomNothingThe same file mechanism with your own paths and reload command, for anything else that reads certificates from disk.
HAProxyReload systemctl reload haproxyWrites 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

PresetWhat 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-IPUploads 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 LoadMasterUploads 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

PresetWhat it does
Fortinet FortiGateImports 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 FirewallUploads over the SFOS XML API. The host must include the API port - Sophos's own examples use :4444.
WatchGuard FireboxImports 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

PresetWhat it does
VMware vCenter ServerReplaces 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 PrismImports into Prism Central or Element over its certificate-management API. The key type is detected from the issued certificate.
Proxmox VEUploads 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

PresetWhat it does
KubernetesCreates 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 containerCopies 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>.

FieldNotes
Script filenameA bare filename, never a path. .sh on Linux, .ps1 on Windows.
VariablesUp 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:

  1. The name resolves inside the agent's scripts directory, with no traversal and no symlink escape.
  2. It is a regular file.
  3. It is not group- or world-writable.
  4. 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

TargetRequirement
Windows store, IIS, RDP, WinRMLocal administrator on the agent host
ExchangeAgent on the Exchange server, Exchange Management Shell present
AD FSAgent on the AD FS server, AD FS PowerShell module present
RDS deploymentAgent on or able to reach the RD Connection Broker, RemoteDesktop PowerShell module present
SQL ServerAgent on the SQL Server host
Skype for Business / LyncAgent on the front-end server, Management Shell present
Hyper-V ReplicaAgent on the Hyper-V host
VMware HorizonAgent on the Connection Server itself
Citrix StoreFrontAgent on the StoreFront server itself
NGINX, Apache, Custom, HAProxyWrite access to the configured paths, and permission to run the reload command
Every appliance and API targetNetwork reach to the management endpoint, and API credentials that may manage certificates
KubernetesNetwork reach to the cluster API server, and a ServiceAccount token scoped to the target namespace
DockerAccess to the Docker socket or named pipe
Custom scriptThe 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.

ConfidenceTargets
Exercisedlinux_file (Apache, Custom), nginx, docker, windows_store (Certificate store, IIS), netscaler, kubernetes
Implemented from vendor documentation, unverified against hardwareExchange, 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 gapsSophos 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.

On this page