File locations
Where every binary, configuration file, log and script lives on a managed host, per platform, plus the service names.
Everything aethercert installs lives under one root per platform, with a subdirectory per component.
| Linux | Windows | |
|---|---|---|
| Install root | /opt/aethercert-agent | C:\Program Files\aethercert |
| Data root | /var/lib/aethercert-agent | C:\ProgramData\aethercert |
The Linux agent is the one exception to the data root: its configuration and state sit
under /etc/aethercert-agent/agent/, where a system configuration file belongs.
Binaries
| Component | Linux | Windows |
|---|---|---|
| Fleet agent | /opt/aethercert-agent/aethercert-agent | C:\Program Files\aethercert\agent\aethercert-agent.exe |
| CA connector | not applicable | C:\Program Files\aethercert\ca-connector\aethercert-ca-connector.exe |
| Certificate connector | /opt/aethercert-agent/cert-connector/aethercert-cert-connector | C:\Program Files\aethercert\cert-connector\aethercert-cert-connector.exe |
| Update Service | /opt/aethercert-agent/main/aethercert-update-service | C:\Program Files\aethercert\main\aethercert-update-service.exe |
| Tray | not applicable | C:\Program Files\aethercert\main\aethercert-tray.exe |
The tray and the Update Service share a main directory because neither is scoped to one
product: the tray covers both backends, and the Update Service updates both.
Configuration and state
| Component | Linux | Windows |
|---|---|---|
| Agent config | /etc/aethercert-agent/agent/config.json | C:\ProgramData\aethercert\agent\config.json |
| Agent state | /etc/aethercert-agent/agent/ | C:\ProgramData\aethercert\agent\ |
| Agent scripts | /etc/aethercert-agent/agent/scripts/ | C:\ProgramData\aethercert\agent\scripts\ |
| CA connector config | not applicable | C:\ProgramData\aethercert\ca-connector\config.json |
| Certificate connector config and key store | /etc/aethercert-agent/cert-connector/ | C:\ProgramData\aethercert\cert-connector\ |
| Update Service state | /var/lib/aethercert-agent/main/ | C:\ProgramData\aethercert\main\ |
| Tray state | not applicable | %LOCALAPPDATA%\aethercert\tray\ (per user) |
| Installer state | /var/lib/aethercert-agent/setup/ | C:\ProgramData\aethercert\setup\ |
State includes the ACME account key and the cached certificate material the agent keeps so
a redeployment does not have to reissue. On Linux, config.json is written 0600 inside a
0700 directory; private keys are written the same way. On Windows, where file modes do
not apply, every component restricts its state directory every time it starts (from
2026.10.7.0.0): SYSTEM, Administrators and - if the service runs under its own account -
that account; only logs\ stays readable for other local users. The data root
C:\ProgramData\aethercert itself belongs to Administrators, and other users may read
it but not create anything in it. A link that a non-administrator put into one of these
directories is deleted; if a component's whole directory is such a link, the service
refuses to start, and aethercert-installer repair names the link. To add a deploy script
to scripts\, use an elevated prompt or accept Explorer's administrator prompt.
The Update Service has no config.json of its own - it reads whichever backend's config is
already on the host.
The installer's state directory sits outside the others on purpose: an uninstall that deletes the agent's directory must not also delete the log explaining what it just removed.
Logs
One file per UTC day in logs/ inside each component's state directory, with the previous
day compressed into logs/archive/:
<state directory>/logs/2026-09-06.log
<state directory>/logs/archive/2026-09-05.tar.gzRetention follows the plan - see Logs and diagnostics.
Services
| Component | Linux unit | Windows service |
|---|---|---|
| Fleet agent | aethercertagent.service | AetherCertAgent |
| CA connector | not applicable | AetherCertCAConnector |
| Certificate connector | aethercertcertconnector.service | AetherCertCertConnector |
| Update Service | aethercertupdateservice.service | AetherCertUpdateService |
The Linux unit names are the Windows service names lowercased, because systemd unit names
are conventionally lowercase while services.msc shows mixed case. The units live in
/etc/systemd/system/ and carry Restart=on-failure, RestartSec=5 and
AmbientCapabilities=CAP_NET_BIND_SERVICE, and from 2026.10.7.0.0 a sandbox per
component - see systemd sandbox below.
systemd sandbox
Each Linux unit restricts its service as far as that service's job allows:
| Unit | What it may not do |
|---|---|
aethercertcertconnector | Write anywhere but /etc/aethercert-agent/cert-connector/, use any capability but binding a port below 1024, gain privileges, open a Unix socket, see /home, devices or other processes, load kernel modules. |
aethercertagent | Load kernel modules, read the kernel log, change its execution domain, use realtime scheduling, reboot, set the clock. Nothing else: it runs your deploy scripts as root, and anything stricter could stop a script from writing where your certificates go. |
aethercertupdateservice | As the agent, and it has its own /tmp. |
The Update Service brings the units of an existing installation up to date on its next check; each service runs under its new unit from its next restart, which the next update does. A unit you edited by hand is left alone - put your own settings in a drop-in instead, which nothing of aethercert ever touches:
sudo systemctl edit aethercertagent # opens a drop-in for your settings
sudo systemctl restart aethercertagentA drop-in can switch a setting off (ProtectKernelModules=no), or tighten the agent on a
host whose deploy targets you know - for example ProtectSystem=strict with a
ReadWritePaths= line for /etc/aethercert-agent/agent and every directory your
certificates, webroots and scripts write to. Run a deployment after any change.
systemctl status aethercertagent
journalctl -u aethercertagent -fThe Windows tray is launched for the logged-in user from an HKLM Run key rather than as a
service, because it needs an interactive session.
Legacy paths
A host installed before the unified layout has its components under their own top-level
folders - AetherCertAgent, AetherCertCAConnector, AetherCertUpdateService under
Program Files and ProgramData, and /usr/local/bin plus /etc/aethercert-agent/config.json
on Linux. The Update Service migrates such an installation onto the layout above on its own;
nothing has to be re-enrolled.
What an uninstall removes
uninstall without --purge stops and removes the services and leaves everything above in
place, so a later install reuses the host's existing enrollment. --purge deletes the
binaries, configuration and logs as well, and cleans up the now-empty roots.
Certificates already deployed - files at the paths a deploy target wrote to, entries in the Windows certificate store - are never touched by either.
CLI reference
Every command and flag on the four aethercert command-line binaries: the installer, the fleet agent, the CA connector and the Update Service.
Agent troubleshooting
Diagnosing an agent on the host itself: the service will not start, enrollment fails, the binary was quarantined, a deploy step fails, the connector cannot issue.