Appliance deployment (remote)¶
Some devices cannot run an Agent: firewalls, load balancers and application
delivery controllers. Since Agent 1.5.0, an Agent that already runs on a
Windows or Linux machine can deploy a renewed certificate to such a device over
the device's own HTTPS management API. The certificate is issued and renewed
on the Agent machine as usual; a remote.deploy step then uploads the
certificate and key to the appliance, optionally binds it to a service, and
reads it back from the device to check that the new certificate is there.
Tested against a simulated API, not a real device
Every appliance template was tested only against a simulated API built from the vendor's published API documentation. None has been run against a real device yet, and firmware versions differ. Try each template on a non-production device first, and read the details listed for each template below before you rely on it.
The Agent connects outbound to the appliance's management port over HTTPS (443 unless you set another port). Nothing connects to the Agent, and the appliance needs no inbound access to CertIntel. Allow HTTPS from the Agent machine to the management interface in every firewall between them.
Templates¶
The appliance templates (Agent 1.5.0+) appear in the Windows desktop app under
Appliances (remote), in the terminal interface under T on the
Workflows screen (New workflow from a template), and in
dashboard assignments. Each one has two steps:
Obtain certificate, then Deploy to the template name (remote.deploy,
600-second timeout, one retry after 30 seconds; a failure stops the run).
| Template id | Name | What it does |
|---|---|---|
f5-bigip |
F5 BIG-IP (iControl REST) | Uploads the certificate and key over iControl REST, creates the certificate and key objects and optionally points a client SSL profile at them. |
fortigate |
FortiGate (REST API) | Uploads the certificate over the REST API and optionally sets it as the admin or SSL VPN server certificate. |
paloalto-panos |
Palo Alto Networks PAN-OS (XML API) | Imports the certificate and key over the XML API, optionally sets it in an SSL/TLS service profile, and commits. |
netscaler-adc |
NetScaler ADC (NITRO API) | Uploads the certificate and key over the NITRO API and adds or updates an SSL certificate-key pair, so virtual servers bound to it use the new certificate. |
sonicwall |
SonicWall (SonicOS API) | Imports the certificate and key over the SonicOS API and optionally uses it for HTTPS management. |
Fields every appliance template has¶
| Field | Label | Default | Meaning |
|---|---|---|---|
host |
Management host | - | DNS name or IP address of the management interface, without https:// or a port. |
port |
Management port | 443 |
HTTPS port of the management interface. |
tls_verify |
Verify the management interface | system |
System trust store, Pinned certificate (SHA-256) (pin) or CA bundle file on the agent (ca). See Checking the management certificate. |
tls_pin_sha256 |
Pinned SHA-256 fingerprint | empty | For a pinned certificate: the SHA-256 of the management certificate, 64 hexadecimal digits without colons. |
tls_ca_file |
CA bundle file | empty | For a CA bundle: absolute path of a PEM file on the Agent machine with the CA that issued the management certificate. |
credential |
per template (Administrator account or API token/API key) | - | Where the appliance credential comes from: local or a CertIntel platform credential. See Credentials. |
tls_insecure_skip_verify |
Accept any management certificate (not recommended) | off | Skips the check of the management certificate. Shown with (this computer only): allowed only in workflows created on the Agent machine, never in a dashboard assignment. |
F5 BIG-IP¶
| Field | Label | Default |
|---|---|---|
credential |
Administrator account (username and password) | - |
partition |
Partition | Common |
certificate_name |
Certificate name on the device | empty: the first certificate name |
client_ssl_profile |
Client SSL profile | empty: upload only |
The Agent creates /<partition>/<name>.crt, <name>.key and, when there is a
chain, <name>-chain.crt, then removes the uploaded files from the device
(best effort). With a client SSL profile, the profile's certificate key chain
is replaced by the new certificate, key and chain; the Agent then checks
that the profile uses them.
Tested against a simulated API, not a real device. The request shapes come from the iControl REST documentation. Not confirmed on a device: that updating a profile replaces its whole certificate key chain list.
FortiGate¶
| Field | Label | Default |
|---|---|---|
credential |
API token | - |
vdom |
VDOM | root |
certificate_name |
Certificate name on the device (required) | - |
bind |
Use the certificate for | Upload only (none); or Administrator interface (admin) or SSL VPN (sslvpn) |
The certificate name, with the fingerprint suffix, may be at most 35 characters in all. Administrator interface sets the admin server certificate; SSL VPN sets the SSL VPN server certificate of the VDOM.
Tested against a simulated API, not a real device. The request shapes come from the FortiGate documentation and the Fortinet Developer Network (sign-in required). Not confirmed on a device: the Agent sends the leaf certificate followed by the chain in one upload; whether FortiOS accepts the intermediates that way depends on its version.
Palo Alto Networks PAN-OS¶
| Field | Label | Default |
|---|---|---|
credential |
API key | - |
certificate_name |
Certificate name on the device (required) | - |
ssl_tls_profile |
SSL/TLS service profile (shared) | empty: import only |
commit |
Commit | Commit the configuration (yes); or Leave the change for an administrator to commit (no) |
The Agent imports the key pair, then each intermediate as <name>-ca<N>, and
optionally sets the certificate in the shared SSL/TLS service profile.
A commit activates every pending change
A PAN-OS commit activates every pending change on the firewall, not only the certificate. If other administrators stage changes on the same firewall, set Commit to Leave the change for an administrator to commit; the run summary then says (not committed).
Tested against a simulated API, not a real device. The request shapes come
from the PAN-OS documentation. Not
confirmed on a device: that a certificate entry's public-key element holds
the certificate PEM (taken from the documented configuration schema).
NetScaler ADC¶
| Field | Label | Default |
|---|---|---|
credential |
Administrator account (username and password) | - |
certkey_name |
Certificate-key pair (required, at most 31 characters) | - |
save_config |
Save the configuration | Save the running configuration (yes); or Do not save (no) |
The certificate and key files are uploaded as
/nsconfig/ssl/<pair>-<fingerprint>.crt and .key. An existing
certificate-key pair is updated in place and keeps its bindings; the pair name
itself gets no suffix. The Agent then checks that the pair uses the new file.
Tested against a simulated API, not a real device. The request shapes come
from the NITRO API reference.
Not confirmed on a device: the certificate file carries the leaf followed by
the chain with "bundle": "YES" (ADC 13.0 and later); linking a separately
installed intermediate is left to the administrator.
SonicWall¶
| Field | Label | Default |
|---|---|---|
credential |
Administrator account (username and password) | - |
certificate_name |
Certificate name on the device (required) | - |
bind |
Use the certificate for | Import only (none); or HTTPS management (management) |
The Agent imports a one-time PKCS#12 archive, optionally uses the certificate for HTTPS management, commits the pending changes and logs out. The passphrase of the one-time archive is part of the import URL, as the API describes it.
Tested against a simulated API, not a real device. Not every detail could be confirmed from the published SonicWall documentation: the import, read-back and HTTPS-management paths and request bodies are assumptions and must be confirmed against a device before production use.
Object names on the device¶
Each issued certificate gets its own object on the device, named
<base>-<the first 8 hexadecimal digits of its SHA-256>, so a renewal never
overwrites an object a service is still using, and a retried run finds the
object it uploaded before. <base> is the Certificate name on the device
(characters the device does not allow become -, and the name is shortened to
the device's limit); when it is empty, the first certificate name without
*., or certintel.
Every renewal therefore adds objects. The Agent does not remove old certificates from the device yet: delete those no service uses any more on the device itself. If the device already holds a different certificate under the same name, the step fails (for example FortiGate already holds a different certificate named … ; remove it or choose another certificate name).
Checking the management certificate¶
The Agent checks the appliance's management certificate before it sends the credential:
| Mode | When to use it |
|---|---|
System trust store (system, default) |
The management interface has a certificate the Agent machine already trusts. |
Pinned certificate (SHA-256) (pin) |
The appliance uses a self-signed or private certificate. The Agent accepts exactly that certificate. Renewing or regenerating the management certificate on the device changes the fingerprint, and the step then fails until you update the pin. |
CA bundle file on the agent (ca) |
A private CA issued the management certificate; the PEM file holds that CA (at most 1 MiB). |
Accept any management certificate (not recommended) (tls_insecure_skip_verify) |
Only for a test device. The credential could be sent to an impostor. Allowed only in workflows created on the Agent machine; refused in dashboard assignments (an unverified management certificate (insecure) is accepted only by a workflow created on this computer; pin the certificate's SHA-256 or name a CA file instead). Validation warns, and the run summary says management certificate NOT verified (insecure). |
The pinned fingerprint is the SHA-256 of the management certificate itself (the leaf, in DER form): 64 hexadecimal digits without colons. Compute it from the Agent machine, so you pin what the Agent sees, and compare it with the fingerprint the device shows in its own management console.
On Linux or any machine with OpenSSL:
openssl s_client -connect fw01.example.net:443 -servername fw01.example.net </dev/null 2>/dev/null \
| openssl x509 -outform DER | sha256sum
On Windows PowerShell:
$hostName = 'fw01.example.net'; $port = 443
$tcp = [System.Net.Sockets.TcpClient]::new($hostName, $port)
$ssl = [System.Net.Security.SslStream]::new($tcp.GetStream(), $false, { $true })
$ssl.AuthenticateAsClient($hostName)
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::new($ssl.RemoteCertificate)
$cert.GetCertHashString('SHA256').ToLowerInvariant()
$ssl.Dispose(); $tcp.Dispose()
The PowerShell example accepts any certificate only to read it; verify the
result against the device console before you pin it. If a tool prints the
fingerprint with colons or in upper case (AB:CD:…), remove the colons; the
field expects 64 hexadecimal digits without colons (the pinned SHA-256
fingerprint must be 64 hexadecimal digits without colons).
A mismatch fails the step before the credential is sent: the management certificate (SHA-256 …) does not match the pinned fingerprint.
Credentials¶
A template's credential field never holds the credential itself, only where it comes from.
Local credential¶
Local means a local administrator stores the credential on the Agent machine, in the Agent's protected secret store:
Run it from an elevated prompt (Windows) or with sudo (Linux); it prompts
without echo, and --stdin is available for automation. A username and
password are entered as username:password; an API token as the token alone.
The desktop app offers a Set… button next to the field (Local: set on this
computer), and the terminal interface asks with a hidden prompt after saving
(Set the local credential now). Until the credential is set, a run fails
with credential not set: certintel secret set remote WORKFLOW-ID:credential.
A local credential works while the configuration lock
is on. Workflows created on the Agent machine always use local credentials.
Platform credential¶
A workflow created from a dashboard assignment may instead name a platform credential stored in CertIntel. The Agent fetches it at each run, sealed to a key only this Agent holds, and uses it in memory for that one step. This needs all of the following:
- A local opt-in. A local administrator allows it on the device: in the
terminal interface, Settings → Platform credentials (appliances) →
Receive appliance credentials from the CertIntel platform; in the desktop
app, Settings → Platform credentials (appliances) → Allow platform
credentials…; or
"remote_credentials": "accept"in the configuration. The approval dialog reads Allow this agent to receive appliance credentials from the CertIntel platform. CertIntel can never turn this on, and neither can an assignment. - The configuration lock is off. While the lock is on, platform credentials are not fetched (Configuration lock is on; platform credentials are not fetched.).
- The workflow was created by a dashboard assignment that names the credential. A workflow created on the device that names a platform credential is refused.
- An approved sealing key. Turning the opt-in on creates the Agent's sealing key. CertIntel pins the first key the Agent reports. A different key (after a re-enrolment or a rotation) must be approved on the Agent's host page in the dashboard before CertIntel delivers anything to it; see Platform credentials.
Each delivery is valid for 5 minutes and bound to the organization, the
assignment, the credential, the delivery and the sealing key. To replace the
sealing key (for example after a suspected compromise of the machine), run
certintel secret rotate-sealing-key as an administrator, or use Rotate
sealing key… in the desktop app or the Sealing key row in the terminal
interface; then approve the new key on the host page.
What is logged¶
- The Agent's activity log records
remote-credential-fetched(with the credential, delivery, assignment, workflow, step, run and key ids, or the local secret name),remote-credential-refused(with the reason),sealing-key-createdandsealing-key-rotated. Only ids and reasons are recorded, never the credential. - A successful run's summary names the driver, the host, the object on the device and the binding, and ends with verified. With an unverified management certificate it adds management certificate NOT verified (insecure).
- When a step fails, the redacted end of its output goes to CertIntel with the failure report (see failed step output); the credential and its base64 forms are removed from it.
- In CertIntel, every delivery and refused delivery of a platform credential is in the activity log.
The credential never appears in command-line arguments, environment variables, logs, the activity log, the Agent's state files or reports.
What remains
The Agent clears the credential from its own buffers after the step, but the Go and .NET runtimes can keep transient copies in memory, so this is best effort. Someone with administrator, SYSTEM or root access to the Agent machine can obtain the credentials it uses. Someone who has both the Agent's API key and its secret store can open platform credentials delivered to it. CertIntel trusts the first sealing key an Agent reports: a key stolen before that first report is not detected. Use a dedicated appliance account or token with only the rights the template needs.
Custom programs: the script driver¶
For a device without a built-in template, a workflow created on the Agent
machine can use remote.deploy with driver: "script" to run a program of
your own. CertIntel never proposes it, and it is refused in dashboard
assignments (the script driver runs only in workflows created on this
computer).
options.executableis the absolute path of a regular executable file;options.argumentsis an optional list. Arguments cannot reference secrets (the script gets its credential on stdin; arguments cannot reference secrets).- The program reads one JSON document on standard input:
schema(1),driver,template(id,version),run_id,target(host,port,tlswithverifyand, when set,pin_sha256orca_file),credential(kindandusername/passwordortoken),certificate(names,fingerprint_sha256,thumbprint_sha1,not_after,certificate_pem,chain_pem,private_key_pem) andvariables. The program must check the management certificate itself astarget.tlssays. - The environment is minimal, not the service's: on Linux
PATH=/usr/sbin:/usr/bin:/sbin:/binandLANG=C.UTF-8; on WindowsSystemRoot,windir,SystemDrive,ComSpec,PATHEXT,PATH,TEMPandTMP; plusCERTINTEL_WORKFLOW_ID,CERTINTEL_STEP_ID,CERTINTEL_DRIVERandCERTINTEL_RUN_ID. - Exit code 0 is success (the script exited with code N otherwise). The step
outputs
exitCodeand the end ofstdoutandstderr, with the credential removed. - On timeout the program is stopped with its child processes (the program did not finish within the step timeout and was stopped with its child processes): a process group on Linux, a job object on Windows. On Windows, a child process the program starts in the instant before it is placed in the job can escape that stop.
Related pages¶
- Platform credentials - storing appliance credentials in CertIntel and approving sealing keys
- Dashboard-assigned workflows - proposing an appliance template to an Agent
- Modular workflow builder & action inputs - template fields and actions
- Microsoft services - Windows server roles on the Agent machine itself
- Linux service targets - HAProxy, Caddy, Postfix and other local services
- Windows Agent and Linux Agent - the configuration lock