Skip to content

Agents

SSL-CLM Agents are lightweight Java services deployed on remote hosts to execute certificate operations locally. They enable secure, distributed lifecycle management for infrastructure that isn’t directly API-accessible from the platform.

Navigation: Sidebar → Infrastructure → Agents

Agents


The main view displays all registered agents:

ColumnDescription
NameAgent display name or label
HostHostname of the machine running the agent
OSOperating system and version
StoresNumber of certificate stores managed by this agent
StatusConnection status badge
Last SeenTime since last heartbeat
ActionsView, Disable, Delete
  • Search — Filter by name or hostname
  • Status Dropdown — Filter by: All Statuses, ONLINE, OFFLINE, BOOTSTRAPPING, DISABLED

StatusColorMeaning
ONLINEGreenAgent is connected, heartbeat active, ready to execute jobs
BOOTSTRAPPINGBlueAgent recently registered, completing initial setup
OFFLINERedNo heartbeat received within timeout threshold
DISABLEDGrayManually disabled by administrator — will not receive jobs
EXPIREDRedAgent’s mTLS certificate has expired — requires re-bootstrap
SAFE_MODEOrangeRestricted operation due to auth failure — fail-closed state

  1. Click + Register Agent
  2. Enter the agent hostname
  3. Click Generate Token
  4. Copy the one-time bootstrap token

Bootstrap tokens are:

  • One-time use — Consumed upon first agent registration
  • Time-limited — Expire after a configurable window (default: 24 hours)
  • Irrevocable — Once used, cannot be reused

Download the agent JAR from the platform or obtain it from your deployment package:

ssl-clm-agent-<version>.jar

System requirements:

  • Java 21+
  • Outbound HTTPS access to the SSL-CLM platform
  • No inbound ports required

Linux:

Terminal window
java -jar ssl-clm-agent.jar \
--backend.url=https://ssl-clm.example.com:8080 \
--bootstrap.token=YOUR_BOOTSTRAP_TOKEN

Windows (PowerShell):

Terminal window
$env:API_URL = "https://ssl-clm.example.com:8080"
$env:AGENT_BOOTSTRAP_TOKEN = "YOUR_BOOTSTRAP_TOKEN"
java -jar ssl-clm-agent.jar

After starting, the agent:

  1. Sends the bootstrap token to the platform
  2. Receives a unique agent ID and mTLS client certificate
  3. Stores credentials locally
  4. Begins heartbeat reporting
  5. Appears in the Agents list with BOOTSTRAPPING → ONLINE status

Click any agent row to open its detail page:

FieldDescription
Agent IDUnique identifier
HostnameMachine hostname
StatusCurrent connection state
Bootstrap CompletedWhether initial registration completed
Last HeartbeatMost recent heartbeat timestamp
CreatedRegistration timestamp
FieldDescription
FingerprintSHA-256 fingerprint of the agent’s client certificate
ExpiresExpiry date of the mTLS certificate
Days Until ExpirationRemaining validity
FieldDescription
VersionAgent software version
Build DateWhen the agent binary was built
Git CommitSource commit hash

The agent reports its supported capabilities during registration:

  • CA operations (ISSUE_CERT, REVOKE_CERT, CA_REFRESH)
  • Store operations (DEPLOY_CERT, DISCOVER_STORE, BIND_CERT)
  • Discovery operations (NETWORK_SCAN)

List of certificate stores that are assigned to this agent.

History of jobs executed by this agent with status and timestamps.


Agents use a pull-based model — they poll the platform for jobs at configurable intervals:

Agent → (HTTPS Poll) → Platform: "Any jobs for me?"
Platform → Agent: Job payload (or empty)
Agent → (executes locally) → Result
Agent → (HTTPS POST) → Platform: Job result

No inbound firewall rules required on the agent host.

OperationDefault Interval
Heartbeat30 seconds
Job polling10 seconds
Health check5 minutes

After bootstrap, all communication uses mutual TLS:

  • Agent authenticates to platform with its client certificate
  • Platform authenticates to agent with its server certificate
  • All traffic encrypted end-to-end

# Platform connection
backend.url=https://ssl-clm.example.com:8080
# Bootstrap (first run only)
bootstrap.token=CHANGE_ME
# Intervals
agent.heartbeat.fixedDelayMs=30000
agent.jobs.fixedDelayMs=10000
# mTLS (production recommended)
backend.mtls.enabled=true
backend.mtls.client-cert-path=/etc/ssl-clm-agent/client.pem
backend.mtls.client-cert-password=
backend.mtls.ca-cert-path=/etc/ssl-clm-agent/ca.pem
# MSCA Integration (optional)
agent.msca.enabled=false
agent.msca.ca-identifier=
# Logging
logging.level=INFO

All properties can be set as environment variables:

Terminal window
export BACKEND_URL=https://ssl-clm.example.com:8080
export BOOTSTRAP_TOKEN=your_token
export AGENT_MSCA_ENABLED=true
export AGENT_MSCA_CA_IDENTIFIER=WIN-SERVER\\my-ca

Job TypeDescriptionAgent Action
CA_REFRESHSync certificate inventory from on-prem CAQuery CA, return certificate list
ISSUE_CERTIssue a certificate via the CASubmit CSR, return issued cert
REVOKE_CERTRevoke a certificateExecute revocation on CA
DEPLOY_CERTDeploy certificate to a storeWrite files, reload service
DISCOVER_STOREScan a local store for certificatesRead store, return cert list
BIND_CERTBind certificate to a serviceUpdate service configuration
NETWORK_SCANScan local network for TLS certsPerform TLS handshakes, return results

Create /etc/systemd/system/ssl-clm-agent.service:

[Unit]
Description=SSL-CLM Agent
After=network.target
[Service]
Type=simple
User=ssl-clm-agent
ExecStart=/usr/bin/java -jar /opt/ssl-clm-agent/ssl-clm-agent.jar
Restart=always
RestartSec=10
Environment=BACKEND_URL=https://ssl-clm.example.com:8080
[Install]
WantedBy=multi-user.target
Terminal window
sudo systemctl daemon-reload
sudo systemctl enable ssl-clm-agent
sudo systemctl start ssl-clm-agent
Terminal window
# Using NSSM (Non-Sucking Service Manager)
nssm install SSLCLMAgent "C:\Program Files\Java\jdk-21\bin\java.exe" "-jar C:\ssl-clm-agent\ssl-clm-agent.jar"
nssm set SSLCLMAgent AppEnvironmentExtra "BACKEND_URL=https://ssl-clm.example.com:8080"
nssm start SSLCLMAgent

The agent enters Safe Mode (fail-closed) when:

  • mTLS certificate is revoked by the platform
  • Agent identity is rejected
  • Backend returns persistent authorization failures

In Safe Mode:

  • All job execution stops
  • Heartbeat stops
  • Agent waits for manual re-bootstrap
  • No certificates are modified

To recover: generate a new bootstrap token and restart the agent.


The agent’s own mTLS client certificate has a validity period. Before it expires:

  • The platform monitors agent certificate expiration
  • An alert is generated when the agent cert is approaching expiry
  • The platform can automatically renew the agent’s certificate (if configured)
  • If the certificate expires, the agent enters EXPIRED status and stops functioning

PrincipleImplementation
Zero TrustmTLS authentication on every request
Least PrivilegeAgent only receives jobs for its assigned stores/CAs
One-Time BootstrapToken consumed on first use, cannot be replayed
No Inbound PortsPull-based model — agent initiates all connections
Fail-ClosedSafe Mode on any auth failure
Audit TrailAll agent actions are logged with actor AGENT:{id}
Secret IsolationAgent never sends private keys to the platform unless explicitly configured

SymptomPossible CauseResolution
Agent not appearing after registrationBootstrap token expired or already usedGenerate a new token
Agent shows OFFLINEProcess not running, or network issuesCheck agent process, verify HTTPS connectivity to platform
Jobs not executingAgent disabled, or no jobs pendingCheck status, verify store/CA assignments
mTLS errors in logsCertificate expired or revokedRe-bootstrap the agent
Agent in SAFE_MODEPersistent auth failuresInvestigate backend logs, re-bootstrap