Skip to content

Enabling Firefly detailed certificate issuance logging

Firefly now supports logging certificate issuance events, enhancing traceability and audit readiness. Operating as a subordinate Certificate Authority (CA), Firefly plays a critical role in enterprise PKI ecosystems—making visibility into issued certificates essential for detecting anomalies and meeting compliance requirements.

This capability is available in both cert-manager SaaS and Self-Hosted control planes and is designed to integrate seamlessly with centralized logging platforms such as Splunk.

Key Capabilities

  • Centralized Logging of Certificate Events
    Firefly can be configured to emit detailed logs for every certificate request. Logged fields include requester identity, certificate metadata, and issuance context.

  • Optional Certificate Embedding
    For deeper inspection and analytics, teams may choose to include the full PEM-encoded certificate in the log output.

  • Flexible Output Formats
    Logs can be emitted in either plain-text or structured JSON, enabling compatibility with a wide range of logging pipelines and analysis tools.

Turning on detailed certificate issuance logging

Important

This capability requires Firefly version 1.8.0 or later. Older versions will ignore the control plane configuration and will not emit detailed audit log messages.

You can enable detailed certificate issuance logging in the Venafi Control Plane UI.

  1. To turn on Firefly detailed certificate issuance logging, in the Venafi Control Plane UI go to Configuration > Firefly Configurations.
  2. Click the Firefly configuration for which you want to enable logging in the Firefly Configurations page.
  3. In the panel that opens on the right of the page, select the Log certificate issuance information checkbox.

    When selected, Firefly logs each successfully issued certificate's requester, and request details. Optionally, you can also log raw certificate data by selecting the Include raw certificate data checkbox. Firefly saves all the information to the standard Firefly logs in your environment.

    Note

    If you do not see the new configuration option on the Firefly configuration page, it means this feature is not enabled for your tenant. Please contact us to have it enabled.

    If Firefly is running in a Kubernetes environment, the certificate issuance messages can be found in the Pod logs. These logs can be consumed by solutions such as SIEM (Security Information and Event Management) tool.

    When Firefly is run as a standalone binary, logs are output to standard output and can be redirected to a file. Similar to the previous option, the logs can then be consumed by SIEM solutions.

You can set the following properties to enable this feature in the Firefly security configuration

advancedSettings:
  enableIssuanceAuditLog: false
  includeRawCertDataInAuditLog: false

Venafi CLI tool release 1.21.0 (and later) introduces new attributes for the generate subcommand. See the following generated manifest example:

% venctl configuration firefly generate

subCaProvider:
...
minTlsVersion: TLS13
advancedSettings:
  enableIssuanceAuditLog: false
  includeRawCertDataInAuditLog: false

For more information on Firefly security documentation, see Reference: TLS Protect Datacenter configuration.

Configuring the logging format

Firefly 1.8.0 or later supports two logging formats: text and json. The default format is text.

For environments that integrate with SIEM systems, it is recommended to use the json format to enable better parsing and analysis.

Configuring the logging format on Kubernetes using Helm

Use the following values to set the logging format to JSON:

helm upgrade prod oci://registry.venafi.cloud/public/venafi-images/helm/firefly \
  --install \
  --create-namespace \
  --namespace venafi \
  --values values.yaml \
  --set deployment.logFormat=json \
  --version v1.8.0
# values.yaml
deployment:
  logFormat: json
  config:
    bootstrap:
      vaas:
...

Configuring the logging format on Docker or as a standalone application

When running Firefly as a Docker container or standalone application, you can specify the logging format using the --logging-format flag. For example:

docker run "$(id -u):$(id -g)" -e ACCEPT_TERMS=Y -p 8081:8081 -p 8123:8123 -p 8281:8281 --cap-add=IPC_LOCK \
        -v /opt/firefly/config.yaml:/etc/firefly/config.yaml:ro \
        -v /opt/firefly/svc-acct.key:/etc/firefly/svc-acct.key:ro \
        registry.venafi.cloud/public/venafi-images/firefly:v1.8.0 run -c /etc/firefly/config.yaml --logging-format=json

Certificate issuance log schema

Sample output:

{
  "ts": 1746715392175.5826,
  "v": 0,
  "msg": "certificate issued",
  "data": {
    "instanceInfo": {
      "instanceName": "My Firefly Instance",
      "hostname": "my-ff-firefly-6997c76fc5-jc78c"
    },
    "certificate": {
      "subject": {
        "commonName": "my cert",
        "dn": "cn=my cert, o=acme"
      },
      "validity": {
        "from": "2025-05-08T12:03:12Z",
        "to": "2025-05-09T12:03:12Z"
      },
      "issuer": {
        "commonName": "my-ca",
        "dn": "cn=my-ca, o=my-org"
      },
      "altNames": {
        "dnsNames": ["foo.com", "bar.com"],
        "ipAddresses": [],
        "emailAddresses": [],
        "uris": []
      },
      "signatureAlgorithm": "ECDSA-SHA256",
      "keyType": "RSA_2048",
      "serialNumber": "709EA3B0E41DECD4011F4107A52B7F6A7BB4F2C4",
      "fingerprint": "sha256:ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
      "pem": "-----BEGIN CERTIFICATE-----\nMIIDvTCCAqWgAwIBAgIUTn9nkPYOFy6CET1y4lhTHXh7Mxkw..."
    },
    "request": {
      "requester": {
        "identity": "alice"
      },
      "authentication": {
        "type": "JWT_OIDC"
      },
      "policyName": "my issuance policy",
      "interface": "grpc:tcp",
      "operation": "GENERATE_AND_SIGN"
    }
  }
}

Sample output:

I0620 16:37:03.304953  686079 auditlog.go:209] "certificate issued" logger="firefly.agent.server"
  data.instanceInfo.instanceName="My Firefly Instance"
  data.instanceInfo.hostname="my-ff-firefly-6997c76fc5-jc78c"
  data.certificate.subject.commonName="my cert"
  data.certificate.subject.dn="cn=my cert, o=acme"
  data.certificate.validity.from="2025-05-08T12:03:12Z"
  data.certificate.validity.to="2025-05-09T12:03:12Z"
  data.certificate.issuer.commonName="my-ca"
  data.certificate.issuer.dn="cn=my-ca, o=my-org"
  data.certificate.signatureAlgorithm="ECDSA-SHA256"
  data.certificate.keyType="RSA_2048"
  data.certificate.serialNumber="709EA3B0E41DECD4011F4107A52B7F6A7BB4F2C4"
  data.certificate.fingerprint="sha256:ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad"
  data.certificate.pem="-----BEGIN CERTIFICATE-----\\nMIIDvTCCAqWgAwIBAgIUTn9nkPYOFy6CET1y4lhTHXh7Mxkw..."
  data.request.requester.identity="alice"
  data.request.authentication.type="JWT_OIDC"
  data.request.policyName="my issuance policy"
  data.request.interface="rest:tcp"
  data.request.operation="GENERATE_AND_SIGN"
  data.certificate.altNames.dnsNames="foo.com;bar.com"
  data.certificate.altNames.ipAddresses="[]"
  data.certificate.altNames.emailAddresses="[]"
  data.certificate.altNames.uris="[]"

Certificate issuance log entry structure

Each certificate issuance log entry records the issuance of a certificate and the context of the request. Each entry includes the following sections:

Property Description
ts Timestamp of the log entry. Example: 2025-05-08T12:03:12.175582603+01:00.
v Log level.
msg Log message. Example: certificate issued.
data.instanceInfo.instanceName The name of the Firefly instance that issued the certificate. Example: My Firefly Instance.
data.instanceInfo.hostname The hostname of the Firefly pod or server that processed the request. Example: my-ff-firefly-6997c76fc5-jc78c.
data.certificate.subject.commonName The Common Name (CN) from the certificate subject. Example: my-cert.
data.certificate.subject.dn The full Distinguished Name (DN) string of the subject. Example: CN=my-cert,O=Example Corp,C=US.
data.certificate.validity.from Start date and time (UTC, RFC 3339 format). Example: 2023-08-01T10:26:06.666+00:00.
data.certificate.validity.to Expiry date and time (UTC, RFC 3339 format). Example: 2024-08-01T10:26:06.666+00:00.
data.certificate.issuer.commonName The Common Name (CN) of the issuer. Example: my-ca.
data.certificate.issuer.dn The full Distinguished Name (DN) of the issuer. Example: CN=my-ca,O=my-org.
data.certificate.altNames.dnsNames List of DNS names. Example: [ "*.foo.com" ].
data.certificate.altNames.ipAddresses List of IP addresses as strings.
data.certificate.altNames.emailAddresses List of email addresses.
data.certificate.altNames.uris List of URI SANs.
data.certificate.signatureAlgorithm The algorithm used to sign the certificate. Possible values include: MD5-RSA, SHA1-RSA, SHA256-RSA, SHA384-RSA, SHA512-RSA, SHA256-RSAPSS, SHA384-RSAPSS, SHA512-RSAPSS, DSA-SHA1, DSA-SHA256, ECDSA-SHA1, ECDSA-SHA256, ECDSA-SHA384, ECDSA-SHA512, Ed25519.
data.certificate.keyType The type and size of the public key. Possible values: RSA_2048, RSA_3072, RSA_4096, EC_P256, EC_P384, EC_P521, EC_ED25519.
data.certificate.serialNumber The certificate’s serial number (hexadecimal string). Example: 709EA3B0E41DECD4011F4107A52B7F6A7BB4F2C4.
data.certificate.fingerprint The SHA-256 fingerprint of the certificate, prefixed with sha256:. Example: sha256:ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad.
data.certificate.pem The PEM-encoded certificate (only included if enabled in the UI), with newlines escaped. Example: a block starting with -----BEGIN CERTIFICATE-----.
data.request.requester.identity For JWT: the sub (subject) claim from the JWT. For IID: the format depends on the Cloud provider used (AWS example: aws://account/123456789012/region/us-west-2/instanceId/i-1234567890abcdef0, Google example: google://projects/my-project/zone/us-west1-a/instances/example-vm, Azure example: azure://subscriptions/1abcd1234-5678-90ab-cdef-1234567890ab/resourceGroups/myresourcegroup/providers/Microsoft.Compute/virtualMachines/my-vm/objectId/12345678-1234-1234-1234-1234567890ab).
data.request.authentication.type The method used to authenticate certificate requests sent to Firefly. Options: None, JWT_OIDC, JWT_JWKS, IID.
data.request.policyName The name of the Firefly policy that was used to make the request.
data.request.interface The interface through which the request was received. Possible values: grpc:tcp, grpc:uds, rest:tcp, rest:uds, cert-manager, kubernetes-csr.
data.request.operation The type of operation performed. Possible values: GENERATE_AND_SIGN, SIGN_PUBLIC_KEY, SIGN_CSR.
data.request.requestedValidity The requested validity period for the certificate, in RFC 3339 duration format. Example: P1D.