Agent Installation
Agent Installation
Section titled “Agent Installation”The QCecuring SSL-CLM Agent enables secure, distributed certificate lifecycle execution on remote infrastructure. Deploy agents on servers that need:
- Local CA access (e.g., Microsoft AD CS on a domain-joined server)
- File-based certificate deployment (NGINX, Apache, JKS stores)
- IIS certificate management
- Local network discovery
- Store scanning
The agent does not expose inbound ports — all communication is outbound via HTTPS/mTLS.
Supported Platforms
Section titled “Supported Platforms”| OS | Version | Architecture |
|---|---|---|
| Windows Server | 2016, 2019, 2022 | x64 |
| Ubuntu | 20.04, 22.04, 24.04 | x64, ARM64 |
| RHEL / CentOS | 8, 9 | x64 |
| Debian | 11, 12 | x64 |
| SUSE | 15 | x64 |
Prerequisites
Section titled “Prerequisites”| Requirement | Details |
|---|---|
| Java | 21+ |
| Network | Outbound HTTPS to SSL-CLM platform (port 8080 or 443) |
| Bootstrap Token | Generated from the platform UI |
| Disk | ~100 MB for agent + logs |
| RAM | 256 MB minimum, 512 MB recommended |
Step 1 — Generate Bootstrap Token
Section titled “Step 1 — Generate Bootstrap Token”- In the SSL-CLM UI, navigate to Infrastructure → Agents
- Click + Register Agent
- Enter the agent hostname
- Click Generate Token
- Copy the one-time bootstrap token
The token is:
- Single-use — Consumed on first registration
- Time-limited — Expires after 24 hours (configurable)
- Non-recoverable — Cannot be viewed again after generation
Step 2 — Install Java
Section titled “Step 2 — Install Java”Linux (Ubuntu/Debian)
Section titled “Linux (Ubuntu/Debian)”sudo apt update && sudo apt install -y openjdk-21-jre-headlessjava -versionLinux (RHEL/CentOS)
Section titled “Linux (RHEL/CentOS)”sudo dnf install -y java-21-openjdk-headlessjava -versionWindows
Section titled “Windows”Download and install Java 21 from Adoptium. Verify:
java -versionStep 3 — Download the Agent
Section titled “Step 3 — Download the Agent”Download the agent JAR from the platform:
- Navigate to Infrastructure → Agents → Download Agent
- Or obtain from your deployment package
Place on the target server:
mkdir -p /opt/ssl-clm-agentcp ssl-clm-agent-<version>.jar /opt/ssl-clm-agent/Step 4 — First Run (Bootstrap)
Section titled “Step 4 — First Run (Bootstrap)”java -jar /opt/ssl-clm-agent/ssl-clm-agent.jar \ --backend.url=https://ssl-clm.example.com:8080 \ --bootstrap.token=YOUR_BOOTSTRAP_TOKENWindows (PowerShell)
Section titled “Windows (PowerShell)”$env:BACKEND_URL = "https://ssl-clm.example.com:8080"$env:AGENT_BOOTSTRAP_TOKEN = "YOUR_BOOTSTRAP_TOKEN"java -jar C:\ssl-clm-agent\ssl-clm-agent.jarWhat Happens During Bootstrap
Section titled “What Happens During Bootstrap”- Agent sends the bootstrap token to the platform
- Platform validates the token (one-time use)
- Platform issues an mTLS client certificate to the agent
- Agent stores the certificate and key locally
- Agent begins heartbeat reporting
- Agent appears in the Agents list as BOOTSTRAPPING → ONLINE
After successful bootstrap, the token is consumed and not needed again.
Step 5 — Configuration File
Section titled “Step 5 — Configuration File”After bootstrap, create a persistent configuration:
Linux: /opt/ssl-clm-agent/application.properties
Section titled “Linux: /opt/ssl-clm-agent/application.properties”# Platform connectionbackend.url=https://ssl-clm.example.com:8080
# Intervals (milliseconds)agent.heartbeat.fixedDelayMs=30000agent.jobs.fixedDelayMs=10000
# mTLS (auto-configured after bootstrap)backend.mtls.enabled=truebackend.mtls.client-cert-path=/opt/ssl-clm-agent/certs/client.pembackend.mtls.client-key-path=/opt/ssl-clm-agent/certs/client-key.pembackend.mtls.ca-cert-path=/opt/ssl-clm-agent/certs/ca.pem
# Microsoft CA (enable if agent manages ADCS)agent.msca.enabled=false# agent.msca.ca-identifier=WIN-SERVER\\my-ca
# Logginglogging.level.root=INFOlogging.file.name=/var/log/ssl-clm-agent/agent.logWindows: C:\ssl-clm-agent\application.properties
Section titled “Windows: C:\ssl-clm-agent\application.properties”backend.url=https://ssl-clm.example.com:8080agent.heartbeat.fixedDelayMs=30000agent.jobs.fixedDelayMs=10000backend.mtls.enabled=trueagent.msca.enabled=trueagent.msca.ca-identifier=WIN-SERVER\\my-calogging.level.root=INFOStep 6 — Run as a Service
Section titled “Step 6 — Run as a Service”Linux (systemd)
Section titled “Linux (systemd)”Create /etc/systemd/system/ssl-clm-agent.service:
[Unit]Description=SSL-CLM AgentAfter=network.target
[Service]Type=simpleUser=ssl-clm-agentWorkingDirectory=/opt/ssl-clm-agentExecStart=/usr/bin/java -jar /opt/ssl-clm-agent/ssl-clm-agent.jarRestart=alwaysRestartSec=10
[Install]WantedBy=multi-user.targetsudo useradd -r -s /bin/false ssl-clm-agentsudo chown -R ssl-clm-agent: /opt/ssl-clm-agentsudo systemctl daemon-reloadsudo systemctl enable ssl-clm-agentsudo systemctl start ssl-clm-agentsudo systemctl status ssl-clm-agentWindows (NSSM)
Section titled “Windows (NSSM)”nssm install SSLCLMAgent "C:\Program Files\Java\jdk-21\bin\java.exe" "-jar C:\ssl-clm-agent\ssl-clm-agent.jar"nssm set SSLCLMAgent AppDirectory "C:\ssl-clm-agent"nssm start SSLCLMAgentStep 7 — Verify
Section titled “Step 7 — Verify”- Check the platform UI: Infrastructure → Agents — agent should show ONLINE
- Check agent logs:
Terminal window # Linuxjournalctl -u ssl-clm-agent -f# Ortail -f /var/log/ssl-clm-agent/agent.log - Test with a job: trigger a discovery scan or CA refresh from the UI
MSCA-Specific Configuration
Section titled “MSCA-Specific Configuration”For agents managing Microsoft AD CS:
agent.msca.enabled=trueagent.msca.ca-identifier=WIN-SERVER\\my-ca-nameAdditional Windows requirements:
- Server must be domain-joined
- Agent process must run as a domain user with enrollment permissions
certutilmust be available in PATH
Optional environment variables for AD CS authentication:
ADCS_SERVER=WIN-SERVERADCS_USERNAME=DOMAIN\ServiceAccountADCS_PASSWORD=StrongPasswordFile Permissions (Linux)
Section titled “File Permissions (Linux)”For agents deploying to web servers, ensure the agent user has write access:
# For NGINX cert pathssudo chown ssl-clm-agent: /etc/nginx/ssl/sudo chmod 750 /etc/nginx/ssl/
# For Apache cert pathssudo chown ssl-clm-agent: /etc/ssl/certs/ /etc/ssl/private/
# For reload commands (sudoers)echo "ssl-clm-agent ALL=(root) NOPASSWD: /bin/systemctl reload nginx, /bin/systemctl reload apache2" | sudo tee /etc/sudoers.d/ssl-clm-agentSecurity Hardening
Section titled “Security Hardening”| Practice | Implementation |
|---|---|
| Run as dedicated user | ssl-clm-agent user with minimal permissions |
| mTLS only | Disable plain HTTP after bootstrap |
| Restrict outbound | Firewall allows only HTTPS to platform |
| Rotate credentials | Agent cert auto-renewed by platform |
| Log monitoring | Forward agent logs to SIEM |
| Least privilege | Only grant file/service permissions needed |
Troubleshooting
Section titled “Troubleshooting”| Issue | Possible Cause | Resolution |
|---|---|---|
| Bootstrap fails | Token expired or already used | Generate a new token |
| Connection refused | Wrong backend URL or port | Verify URL and firewall rules |
| mTLS handshake error | CA cert mismatch | Ensure agent CA cert matches platform |
| Agent OFFLINE after reboot | Service not enabled | systemctl enable ssl-clm-agent |
| Deploy job fails | File permission denied | Check agent user has write access to cert paths |
| MSCA operations fail | Not domain-joined or wrong CA identifier | Verify domain membership and certutil -ping |
Next Steps
Section titled “Next Steps”After the agent is running:
- Configure Certificate Stores assigned to this agent
- Add a Certificate Authority (if agent-based CA)
- Run a discovery scan using this agent
- Deploy a certificate to verify end-to-end flow