Splunk Platform PKI Setup
Prerequisites
| Tool or access |
Purpose |
Verify |
| Bash and Python 3 |
Run bundled setup and validation helpers |
bash --version && python3 --version |
| Required product/platform access |
Inspect or configure the selected target |
Complete the documented preflight |
| Credential files for live modes |
Keep secrets out of chat |
Verify paths only |
Workflow Overview
┌───────────┐ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐
│ Preflight │ → │ Render/review │ → │ Apply/handoff │ → │ Validate evidence │
└───────────┘ └───────────────┘ └───────────────┘ └─────────────────┘
When to Activate
- Build Splunk PKI, mint certs, prepare third-party CA CSRs, replace default certs, configure mTLS, fix KV Store
cert validation, encrypt replication traffic, configure SAML/LDAPS trust, or rotate Splunk TLS certificates.
- Preview and review the splunk platform pki setup workflow before any live apply phase.
- Diagnose failed prerequisites, generated assets, configuration, or validation evidence.
Scope
Follow the documented read-only or render-first path whenever it is available.
This skill does not imply permission to mutate live systems. Require explicit
apply flags, protected credentials, and operator review for state changes.
Examples
Inspect the supported setup modes before selecting one:
bash skills/splunk-platform-pki-setup/scripts/setup.sh --help
Expected output: usage, supported modes, and required arguments are displayed
without changing the target environment.
Inspect validation modes before running completion checks:
bash skills/splunk-platform-pki-setup/scripts/validate.sh --help
Expected output: offline, live, and completion options are displayed when the
skill supports them; help exits without mutation.
Troubleshooting
| Issue |
Cause |
Resolution |
| Preflight fails |
A required tool or access path is missing |
Resolve it before rendering or applying |
| Rendered assets are incomplete |
Required non-secret inputs are absent |
Complete intake and render again |
| Apply is blocked |
Review, credentials, or explicit acceptance is missing |
Use the documented handoff |
| Validation is incomplete |
Live evidence is unavailable |
Record the gap and keep completion open |
Shared add-on completion gate
If this workflow installs or hands off a registry-listed certificate or health
add-on, follow the shared completion gate.
Package delivery alone is not success; validate applicable collection and
shipped views, or record explicit package evidence that no dashboards ship.
This skill owns the full TLS / PKI lifecycle for a self-managed
Splunk Enterprise deployment. It runs in either of two modes:
- Private PKI — the skill renders scripts that build an internal
Root CA (and optional Intermediate), then mint per-component
server / client certificates with the right
basicConstraints,
keyUsage, and extendedKeyUsage (including the dual serverAuth
clientAuth EKU that KV Store 7.0+ requires), with per-host
SANs.
- Public PKI — the skill renders per-host CSRs +
openssl.cnf and a handoff Markdown for the operator's
third-party CA (HashiCorp Vault PKI, ACME / cert-manager / Let's
Encrypt, Microsoft AD CS, EJBCA, or any commercial CA). It
installs and validates the returned signed PEMs but never embeds
CA credentials.
It is render-first: the default phase produces a reviewable
directory of CA scripts, CSR templates, install / verify scripts,
per-role distribution payloads (cluster bundle, SHC deployer
bundle, standalone, forwarder fleet, Edge Processor placeholders),
rotation runbooks, and operator handoff Markdown. It refuses to
apply changes until the operator passes --accept-pki-rotation.
Read this first — what this skill does NOT do
- It does not talk to a CA. Public-PKI mode renders CSRs and a
handoff Markdown; the operator submits to Vault / ACME / AD CS /
EJBCA / commercial CA out of band.
- It does not implement rolling restart or cluster bundle apply.
Both are delegated to
skills/splunk-indexer-cluster-setup
(matches the repo precedent set by pass4SymmKey rotation,
which is also operator-orchestrated).
- It does not configure Splunk Web HSTS / CSP / browser security
headers. Splunk Web has no
customHttpHeaders; those headers
come from the reverse proxy and are owned by
skills/splunk-enterprise-public-exposure-hardening.
- It never renders SSLv3, TLS 1.0, or TLS 1.1. For Splunk 10.4+, the
default TLS 1.2 floor permits both TLS 1.2 and TLS 1.3 and renders the
documented
[tls1.3] policy; --tls-version-floor tls1.3 enforces
TLS-1.3-only. Older Splunk versions remain TLS-1.2-only.
- It does not build the FIPS-validated OpenSSL module. The
operator owns the FIPS module; the skill flips FIPS on by
setting both
SPLUNK_FIPS=1 (the master enable switch) and
SPLUNK_FIPS_VERSION in splunk-launch.conf.
- It does not issue certificates for Splunk Cloud. It refuses and
emits the
Universal Forwarder Credentials Package
handoff. Splunk Cloud's ACS does not currently expose a
self-service BYOC endpoint for HEC custom-domain certificates;
operators open a Splunk Support ticket or deploy an
inputs.conf-in-app instead.
- It does not generate Java keystores / truststores (JKS / PKCS#12).
Splunk DB Connect uses those and is intentionally out of scope.
- It does not own Splunk SOAR PKI, Splunk Mobile / Secure Gateway
certs, IdP-side configuration, HSM integration for the CA private
key, or CRL / OCSP responder hosting. Each is referenced where
relevant but operator-driven.
- It does not certify compliance (PCI / HIPAA / FedRAMP / SOC 2 /
DISA STIG). It renders STIG-aligned configs (
--tls-policy stig)
and cites NIST controls in
references/fips-and-common-criteria.md
but does not attest.
Architecture the skill assumes
- Private mode builds an internal root/intermediate CA and signs
the role-specific leaf certificates.
- Public mode renders CSRs and operator handoffs for Vault PKI,
ACME, AD CS, EJBCA, or a commercial CA.
- Rendered outputs become cluster-bundle drop-ins, SHC deployer
apps, standalone overlays, and UF fleet overlays.
- Cluster bundle apply and rolling restart remain delegated to
splunk-indexer-cluster-setup; SHC app push remains delegated
to splunk-agent-management-setup.
Agent behavior — credentials
Never paste secrets into chat or pass them on argv. The skill
consumes file paths for every secret and never embeds secret
values in rendered output:
bash skills/shared/scripts/write_secret_file.sh /tmp/splunk_admin_password
bash skills/shared/scripts/write_secret_file.sh /tmp/splunk_idxc_secret
bash skills/shared/scripts/write_secret_file.sh /tmp/pki_root_ca_key_password
bash skills/shared/scripts/write_secret_file.sh /tmp/pki_intermediate_ca_key_password
bash skills/shared/scripts/write_secret_file.sh /tmp/pki_leaf_key_password
bash skills/shared/scripts/write_secret_file.sh /tmp/pki_saml_sp_key_password
Pass them in via --admin-password-file, --idxc-secret-file,
--ca-key-password-file, --intermediate-ca-key-password-file,
--leaf-key-password-file, --saml-sp-key-password-file.
The rendered pki/install/install-leaf.sh script accepts a
separate --ssl-password-file PATH flag — this is the
plaintext leaf-key passphrase the operator copies to each
target host. install-leaf.sh writes it verbatim to the
sslPassword line of the per-host overlay
($SPLUNK_HOME/etc/system/local/server.conf | web.conf | inputs.conf | outputs.conf)
and on first restart Splunk encrypts it with splunk.secret. In
typical deployments --ssl-password-file and
--leaf-key-password-file reference the same plaintext file
(the leaf key's passphrase, which is what Splunk needs to read
the key). Omit --ssl-password-file when the leaf key is
unencrypted (e.g. PKCS#8 nocrypt for Edge Processor).
For non-secret values (FQDNs, SANs, role inventory, validity days,
key algorithm, mTLS surfaces, FIPS mode, TLS preset) use
template.example.
Quick start
Render a Private PKI for a 3-peer indexer cluster + 3-member SHC
with default Splunk-modern algorithms, mTLS on S2S + HEC,
hostname validation everywhere, and the splunkd cert distributed
through the cluster bundle:
bash skills/splunk-platform-pki-setup/scripts/setup.sh \
--phase render \
--mode private \
--target indexer-cluster,shc,license-manager,deployment-server,monitoring-console \
--cm-fqdn cm01.example.com \
--peer-hosts idx01.example.com,idx02.example.com,idx03.example.com \
--shc-deployer-fqdn deployer01.example.com \
--shc-members sh01.example.com,sh02.example.com,sh03.example.com \
--lm-fqdn lm01.example.com \
--ds-fqdn ds01.example.com \
--mc-fqdn mc01.example.com \
--enable-mtls s2s,hec \
--tls-policy splunk-modern \
--include-intermediate-ca true
Render a Public PKI for the same cluster with a HashiCorp Vault PKI
operator handoff and the SAML SP signing cert:
bash skills/splunk-platform-pki-setup/scripts/setup.sh \
--phase render \
--mode public \
--target indexer-cluster,shc,license-manager,saml-sp \
--cm-fqdn cm01.example.com \
--peer-hosts idx01.example.com,idx02.example.com,idx03.example.com \
--shc-deployer-fqdn deployer01.example.com \
--shc-members sh01.example.com,sh02.example.com,sh03.example.com \
--lm-fqdn lm01.example.com \
--saml-sp true \
--public-ca-name vault \
--leaf-days 397
Render a FIPS 140-3 Private PKI with the indexer-cluster replication
port encrypted (atomic migration of [replication_port://9887] to
[replication_port-ssl://9887]):
bash skills/splunk-platform-pki-setup/scripts/setup.sh \
--phase render \
--mode private \
--target indexer-cluster \
--cm-fqdn cm01.example.com \
--peer-hosts idx01.example.com,idx02.example.com,idx03.example.com \
--fips-mode 140-3 \
--tls-policy fips-140-3 \
--encrypt-replication-port true \
--key-algorithm rsa-2048 \
--include-intermediate-ca true
Render the Edge Processor cert pair (RSA-2048 by default; pass
--key-algorithm ecdsa-p256 for ECDSA):
bash skills/splunk-platform-pki-setup/scripts/setup.sh \
--phase render \
--mode private \
--target edge-processor \
--include-edge-processor true \
--ep-fqdn ep01.example.com \
--ep-data-source-fqdn datasource01.example.com \
--key-format pkcs8
Run preflight against a live host (read-only checks; refuses to
apply):
bash skills/splunk-platform-pki-setup/scripts/setup.sh \
--phase preflight \
--mode private \
--target indexer-cluster,shc \
--cm-fqdn cm01.example.com \
--admin-password-file /tmp/splunk_admin_password
Inventory live cert posture (read-only; never writes):
bash skills/splunk-platform-pki-setup/scripts/setup.sh \
--phase inventory \
--target all \
--admin-password-file /tmp/splunk_admin_password
Apply rendered certs to a search head (mutates Splunk; requires
the explicit accept flag):
bash skills/splunk-platform-pki-setup/scripts/setup.sh \
--phase apply \
--mode private \
--target shc \
--shc-deployer-fqdn deployer01.example.com \
--leaf-target shc \
--leaf-host sh01.example.com \
--leaf-cert-file /tmp/signed/sh01.pem \
--leaf-private-key-file /tmp/signed/sh01.key \
--leaf-ca-bundle-file /tmp/signed/cabundle.pem \
--accept-pki-rotation \
--admin-password-file /tmp/splunk_admin_password \
--leaf-key-password-file /tmp/pki_leaf_key_password
Validate live state post-apply:
bash skills/splunk-platform-pki-setup/scripts/validate.sh \
--target indexer-cluster,shc \
--cm-fqdn cm01.example.com \
--admin-password-file /tmp/splunk_admin_password
What it renders
Under the project root in splunk-platform-pki-rendered/:
pki/private-ca/ — only when --mode private: create-root-ca.sh,
create-intermediate-ca.sh, sign-server-cert.sh,
sign-client-cert.sh, sign-saml-sp.sh, plus openssl-*.cnf
files with the documented basicConstraints / keyUsage /
extendedKeyUsage extensions, and a README.md that walks the
operator through CA generation. Uses
$SPLUNK_HOME/bin/splunk cmd openssl genpkey/req/x509 per
Splunk's documented workflow so the same OpenSSL build that
Splunk uses signs and verifies.
pki/csr-templates/<role>-<host>.cnf + generate-csr.sh —
emitted in both modes; per-host CSR config with SANs and EKU.
pki/install/install-leaf.sh, verify-leaf.sh,
kv-store-eku-check.sh, align-cli-trust.sh,
install-fips-launch-conf.sh, prepare-key.sh — cert
install + verify per host. kv-store-eku-check.sh runs the
documented splunk cmd openssl verify -x509_strict check from
the KV Store custom-cert prep doc and refuses to declare a host
ready unless the verification returns OK.
pki/distribute/cluster-bundle/master-apps/000_pki_trust/local/
— cluster-bundle drop-in: server.conf (with
[replication_port-ssl://9887] if --encrypt-replication-port=true),
inputs.conf ([splunktcp-ssl:9997] + [SSL]).
pki/distribute/shc-deployer/shcluster/apps/000_pki_trust/local/
— SHC deployer drop-in: server.conf, web.conf, inputs.conf.
pki/distribute/standalone/000_pki_trust/local/ — for
non-clustered roles (LM, DS, MC, single SH, HF):
server.conf, web.conf, inputs.conf, outputs.conf,
authentication.conf, deploymentclient.conf,
splunk-launch.conf (when FIPS), system-files/ldap.conf
(when LDAPS).
pki/distribute/forwarder-fleet/<group>/{outputs-overlay.conf,server-overlay.conf}
— UF / HF outputs overlay with clientCert /
sslVerifyServerCert=true / sslVerifyServerName=true and
per-indexer [tcpout-server://host:port] SAN overrides.
pki/distribute/edge-processor/ — only when
--include-edge-processor=true: 5-file PEM placeholders
(ca_cert.pem.example, edge_server_cert.pem.example,
edge_server_key.pem.example,
data_source_client_cert.pem.example,
data_source_client_key.pem.example) + upload-via-rest.sh.example
for the EP REST upload and README.md for the EP UI walkthrough.
pki/distribute/saml-sp/ — only when --saml-sp=true:
sp-signing.crt, sp-signing.key.placeholder, README.md for
re-uploading IdP metadata after rotation.
pki/rotate/{plan-rotation.md, rotate-leaf-host.sh, swap-trust-anchor.sh, swap-replication-port-to-ssl.sh, expire-watch.sh} — rotation helpers with the delegated
rolling-restart runbook.
handoff/ — CA, Cloud, FIPS, Edge Processor, native expiry monitoring,
optional legacy Splunkbase 3172, health, CIM, and operator checklists.
preflight.sh, validate.sh, inventory.sh, README.md, metadata.json.
Certificate-Monitoring Guardrail
SSL Certificate Checker (3172, app ssl_certificate_checker) stops at 9.4
and must not be installed on Cloud 10.5. Use expire-watch.sh plus
inventory.sh; see post-install monitoring.
Phases
render (default) — produce the reviewable rendered tree. No
Splunk REST calls; safe to run anywhere.
preflight — render then run the live preflight checks: cert
directory permissions, default-cert refusal,
KV-Store EKU verification (splunk cmd openssl verify -x509_strict
must return OK), splunk.secret SHA-256 parity across cluster
members, FIPS posture (refuses mid-Phase-1 / Phase-2 migration),
hostname-validation gating, TLS protocol floor check
(sslVersions = tls1.2), per-host
splunk btool server list sslConfig snapshot, replication-port
mode (cleartext vs SSL), [shclustering] pass4SymmKey
presence reminder. Refuses to mark the deployment ready when any
check fails.
apply — render then run the local-host
pki/install/install-leaf.sh + align-cli-trust.sh +
install-fips-launch-conf.sh if FIPS. Requires
explicit --leaf-target, --leaf-host, and --leaf-ca-bundle-file
inputs, plus --leaf-cert-file and --leaf-private-key-file for every
target except CA-only ldaps, and
--accept-pki-rotation (a single-flag acknowledgement that the
operator is about to swap serving certs and trigger downstream
restart).
rotate — render then emit a rotation runbook
(pki/rotate/plan-rotation.md) describing the full delegated
order. Does NOT exec the rolling restart itself (delegate
pattern, see "Rotation ownership" below), and exits nonzero so
rendering the runbook cannot be mistaken for a completed rotation.
validate — render then run the live validation probes:
REST + openssl s_client -connect per surface, KV Store
handshake check, splunk show-decrypted round-trip on
sslPassword, SAML SP signing cert exposed in IdP-metadata
endpoint.
inventory — read-only: collects
splunk btool server list sslConfig, web list sslConfig,
inputs list http SSL, dumps PEM expiry catalogue and emits
pki/inventory/<host>.json. No Splunk write operations. No
--accept-… required.
all — render + one local-host leaf apply + installed-state preflight, then
stop nonzero at the cluster-aware restart/rotation handoff. Run validate only after that
restart completes. It uses the same explicit leaf inputs and
--accept-pki-rotation gate.
Apply guard — --accept-pki-rotation
The skill refuses to run apply or all without
--accept-pki-rotation. This is a single-flag acknowledgement
that:
- The new cert chain has been verified (
verify-leaf.sh returned
OK).
- A rolling restart of the indexer cluster and SHC will follow
(delegated to
splunk-indexer-cluster-setup --phase rolling-restart).
- The SAML / LDAPS / Edge Processor / Splunk Cloud handoffs (where
applicable) will be completed.
- The operator has a rollback plan (the previous PEM directory
is preserved).
The render and preflight phases never need this flag.
Rotation ownership — delegate
The skill emits pki/rotate/plan-rotation.md, but does not run cluster
or SHC rolling restarts itself. Follow the canonical
rotation runbook for the exact staging,
bundle validation/apply, rolling-restart, SHC push, forwarder rollout,
validation, and rollback commands. That delegation preserves the
splunk-indexer-cluster-setup
ownership model instead of duplicating restart orchestration here.
Handoffs and TLS Policy
Read the cross-skill ownership matrix
before delegating restarts, bundle pushes, token lifecycle, or fleet rollout.
TLS algorithms, protocol floors, FIPS lifecycle, validity caps, key formats,
and mTLS defaults are defined in reference.md
and the topic files under references/.
The renderer consumes the machine-readable
algorithm policy and fails closed on
deprecated protocols or incomplete FIPS transitions.
References
Read reference.md before any apply. Topical deep
dives (each anchored to a specific upstream Splunk doc captured in
references/authoritative-sources.md):
- references/component-cert-matrix.md
- references/private-pki-workflow.md
- references/public-pki-workflow.md
- references/handoff-vault-pki.md
- references/handoff-acme-cert-manager.md
- references/handoff-microsoft-adcs.md
- references/handoff-ejbca.md
- references/kv-store-eku-requirements.md
- references/mtls-and-hostname-validation.md
- references/replication-port-tls.md
- references/saml-signing-certs.md
- references/ldaps-trust.md
- references/edge-processor-pki.md
- references/cli-trust-cacert-alignment.md
- references/tls-protocol-policy.md
- references/algorithm-presets.md
- algorithm-policy.json (machine-readable companion consumed by renderer + preflight)
- references/fips-and-common-criteria.md
- references/key-format-and-permissions.md
- references/rotation-runbook.md
- references/post-install-monitoring.md
- references/splunk-cloud-ufcp-handoff.md
- references/troubleshooting.md
- references/authoritative-sources.md
1---2name: splunk-platform-pki-setup3description: Use when the user asks to build Splunk PKI, mint certs, prepare third-party CA CSRs, replace default certs, configure mTLS, fix KV Store cert validation, encrypt replication traffic, configure SAML/LDAPS trust, or rotate Splunk TLS certificates. Render, preflight, apply, validate, rotate, and inventory private or public PKI for Splunk Enterprise TLS surfaces: Splunk Web, splunkd REST, S2S, HEC, KV Store, indexer clusters, SHC, License Manager, Deployment Server, Monitoring Console, Federated Search, heavy forwarders, Universal Forwarders, Edge Processor, SAML SP signing, LDAPS trust, and CLI CA trust. Covers CSR handoffs, internal CA rendering, FIPS mode, TLS policy presets, KV Store EKU enforcement, default- cert refusal, SAN-aware leaf certs, mTLS, replication-port TLS, and delegated rotation runbooks.4---56# Splunk Platform PKI Setup78## Prerequisites910| Tool or access | Purpose | Verify |11|---|---|---|12| Bash and Python 3 | Run bundled setup and validation helpers | `bash --version && python3 --version` |13| Required product/platform access | Inspect or configure the selected target | Complete the documented preflight |14| Credential files for live modes | Keep secrets out of chat | Verify paths only |1516## Workflow Overview1718```text19┌───────────┐ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐20│ Preflight │ → │ Render/review │ → │ Apply/handoff │ → │ Validate evidence │21└───────────┘ └───────────────┘ └───────────────┘ └─────────────────┘22```2324## When to Activate2526- Build Splunk PKI, mint certs, prepare third-party CA CSRs, replace default certs, configure mTLS, fix KV Store27 cert validation, encrypt replication traffic, configure SAML/LDAPS trust, or rotate Splunk TLS certificates.28- Preview and review the splunk platform pki setup workflow before any live apply phase.29- Diagnose failed prerequisites, generated assets, configuration, or validation evidence.3031## Scope3233Follow the documented read-only or render-first path whenever it is available.34This skill does not imply permission to mutate live systems. Require explicit35apply flags, protected credentials, and operator review for state changes.3637## Examples3839Inspect the supported setup modes before selecting one:4041```bash42bash skills/splunk-platform-pki-setup/scripts/setup.sh --help43```4445Expected output: usage, supported modes, and required arguments are displayed46without changing the target environment.4748Inspect validation modes before running completion checks:4950```bash51bash skills/splunk-platform-pki-setup/scripts/validate.sh --help52```5354Expected output: offline, live, and completion options are displayed when the55skill supports them; help exits without mutation.5657## Troubleshooting5859| Issue | Cause | Resolution |60|---|---|---|61| Preflight fails | A required tool or access path is missing | Resolve it before rendering or applying |62| Rendered assets are incomplete | Required non-secret inputs are absent | Complete intake and render again |63| Apply is blocked | Review, credentials, or explicit acceptance is missing | Use the documented handoff |64| Validation is incomplete | Live evidence is unavailable | Record the gap and keep completion open |6566## Shared add-on completion gate6768If this workflow installs or hands off a registry-listed certificate or health69add-on, follow the [shared completion gate](../shared/ta_completion_gate.md).70Package delivery alone is not success; validate applicable collection and71shipped views, or record explicit package evidence that no dashboards ship.7273This skill owns the **full TLS / PKI lifecycle** for a self-managed74Splunk Enterprise deployment. It runs in either of two modes:7576- **Private PKI** — the skill renders scripts that build an internal77 Root CA (and optional Intermediate), then mint per-component78 server / client certificates with the right `basicConstraints`,79 `keyUsage`, and `extendedKeyUsage` (including the dual `serverAuth`80 + `clientAuth` EKU that **KV Store 7.0+ requires**), with per-host81 SANs.82- **Public PKI** — the skill renders per-host CSRs +83 `openssl.cnf` and a handoff Markdown for the operator's84 third-party CA (HashiCorp Vault PKI, ACME / cert-manager / Let's85 Encrypt, Microsoft AD CS, EJBCA, or any commercial CA). It86 installs and validates the returned signed PEMs but never embeds87 CA credentials.8889It is **render-first**: the default phase produces a reviewable90directory of CA scripts, CSR templates, install / verify scripts,91per-role distribution payloads (cluster bundle, SHC deployer92bundle, standalone, forwarder fleet, Edge Processor placeholders),93rotation runbooks, and operator handoff Markdown. It refuses to94apply changes until the operator passes `--accept-pki-rotation`.9596## Read this first — what this skill does NOT do9798- It does not talk to a CA. Public-PKI mode renders CSRs and a99 handoff Markdown; the operator submits to Vault / ACME / AD CS /100 EJBCA / commercial CA out of band.101- It does not implement rolling restart or cluster bundle apply.102 Both are delegated to103 [`skills/splunk-indexer-cluster-setup`](../splunk-indexer-cluster-setup/SKILL.md)104 (matches the repo precedent set by `pass4SymmKey` rotation,105 which is also operator-orchestrated).106- It does not configure Splunk Web HSTS / CSP / browser security107 headers. Splunk Web has no `customHttpHeaders`; those headers108 come from the reverse proxy and are owned by109 [`skills/splunk-enterprise-public-exposure-hardening`](../splunk-enterprise-public-exposure-hardening/SKILL.md).110- It never renders SSLv3, TLS 1.0, or TLS 1.1. For Splunk 10.4+, the111 default TLS 1.2 floor permits both TLS 1.2 and TLS 1.3 and renders the112 documented `[tls1.3]` policy; `--tls-version-floor tls1.3` enforces113 TLS-1.3-only. Older Splunk versions remain TLS-1.2-only.114- It does not build the FIPS-validated OpenSSL module. The115 operator owns the FIPS module; the skill flips FIPS on by116 setting both `SPLUNK_FIPS=1` (the master enable switch) and117 `SPLUNK_FIPS_VERSION` in `splunk-launch.conf`.118- It does not issue certificates for Splunk Cloud. It refuses and119 emits the120 [Universal Forwarder Credentials Package](https://help.splunk.com/?resourceId=Forwarder_Forwarder_ConfigSCUFCredentials)121 handoff. Splunk Cloud's ACS does not currently expose a122 self-service BYOC endpoint for HEC custom-domain certificates;123 operators open a Splunk Support ticket or deploy an124 `inputs.conf`-in-app instead.125- It does not generate Java keystores / truststores (JKS / PKCS#12).126 Splunk DB Connect uses those and is intentionally out of scope.127- It does not own Splunk SOAR PKI, Splunk Mobile / Secure Gateway128 certs, IdP-side configuration, HSM integration for the CA private129 key, or CRL / OCSP responder hosting. Each is referenced where130 relevant but operator-driven.131- It does not certify compliance (PCI / HIPAA / FedRAMP / SOC 2 /132 DISA STIG). It renders STIG-aligned configs (`--tls-policy stig`)133 and cites NIST controls in134 [references/fips-and-common-criteria.md](references/fips-and-common-criteria.md)135 but does not attest.136137## Architecture the skill assumes138139- Private mode builds an internal root/intermediate CA and signs140 the role-specific leaf certificates.141- Public mode renders CSRs and operator handoffs for Vault PKI,142 ACME, AD CS, EJBCA, or a commercial CA.143- Rendered outputs become cluster-bundle drop-ins, SHC deployer144 apps, standalone overlays, and UF fleet overlays.145- Cluster bundle apply and rolling restart remain delegated to146 `splunk-indexer-cluster-setup`; SHC app push remains delegated147 to `splunk-agent-management-setup`.148149## Agent behavior — credentials150151Never paste secrets into chat or pass them on argv. The skill152consumes **file paths** for every secret and never embeds secret153values in rendered output:154155```bash156bash skills/shared/scripts/write_secret_file.sh /tmp/splunk_admin_password157bash skills/shared/scripts/write_secret_file.sh /tmp/splunk_idxc_secret158bash skills/shared/scripts/write_secret_file.sh /tmp/pki_root_ca_key_password159bash skills/shared/scripts/write_secret_file.sh /tmp/pki_intermediate_ca_key_password160bash skills/shared/scripts/write_secret_file.sh /tmp/pki_leaf_key_password161bash skills/shared/scripts/write_secret_file.sh /tmp/pki_saml_sp_key_password162```163164Pass them in via `--admin-password-file`, `--idxc-secret-file`,165`--ca-key-password-file`, `--intermediate-ca-key-password-file`,166`--leaf-key-password-file`, `--saml-sp-key-password-file`.167168The rendered `pki/install/install-leaf.sh` script accepts a169**separate** `--ssl-password-file PATH` flag — this is the170plaintext leaf-key passphrase the operator copies to each171target host. install-leaf.sh writes it verbatim to the172`sslPassword` line of the per-host overlay173(`$SPLUNK_HOME/etc/system/local/server.conf | web.conf | inputs.conf | outputs.conf`)174and on first restart Splunk encrypts it with `splunk.secret`. In175typical deployments `--ssl-password-file` and176`--leaf-key-password-file` reference the same plaintext file177(the leaf key's passphrase, which is what Splunk needs to read178the key). Omit `--ssl-password-file` when the leaf key is179unencrypted (e.g. PKCS#8 nocrypt for Edge Processor).180181For non-secret values (FQDNs, SANs, role inventory, validity days,182key algorithm, mTLS surfaces, FIPS mode, TLS preset) use183[`template.example`](template.example).184185## Quick start186187Render a Private PKI for a 3-peer indexer cluster + 3-member SHC188with default Splunk-modern algorithms, mTLS on S2S + HEC,189hostname validation everywhere, and the splunkd cert distributed190through the cluster bundle:191192```bash193bash skills/splunk-platform-pki-setup/scripts/setup.sh \194 --phase render \195 --mode private \196 --target indexer-cluster,shc,license-manager,deployment-server,monitoring-console \197 --cm-fqdn cm01.example.com \198 --peer-hosts idx01.example.com,idx02.example.com,idx03.example.com \199 --shc-deployer-fqdn deployer01.example.com \200 --shc-members sh01.example.com,sh02.example.com,sh03.example.com \201 --lm-fqdn lm01.example.com \202 --ds-fqdn ds01.example.com \203 --mc-fqdn mc01.example.com \204 --enable-mtls s2s,hec \205 --tls-policy splunk-modern \206 --include-intermediate-ca true207```208209Render a Public PKI for the same cluster with a HashiCorp Vault PKI210operator handoff and the SAML SP signing cert:211212```bash213bash skills/splunk-platform-pki-setup/scripts/setup.sh \214 --phase render \215 --mode public \216 --target indexer-cluster,shc,license-manager,saml-sp \217 --cm-fqdn cm01.example.com \218 --peer-hosts idx01.example.com,idx02.example.com,idx03.example.com \219 --shc-deployer-fqdn deployer01.example.com \220 --shc-members sh01.example.com,sh02.example.com,sh03.example.com \221 --lm-fqdn lm01.example.com \222 --saml-sp true \223 --public-ca-name vault \224 --leaf-days 397225```226227Render a FIPS 140-3 Private PKI with the indexer-cluster replication228port encrypted (atomic migration of `[replication_port://9887]` to229`[replication_port-ssl://9887]`):230231```bash232bash skills/splunk-platform-pki-setup/scripts/setup.sh \233 --phase render \234 --mode private \235 --target indexer-cluster \236 --cm-fqdn cm01.example.com \237 --peer-hosts idx01.example.com,idx02.example.com,idx03.example.com \238 --fips-mode 140-3 \239 --tls-policy fips-140-3 \240 --encrypt-replication-port true \241 --key-algorithm rsa-2048 \242 --include-intermediate-ca true243```244245Render the Edge Processor cert pair (RSA-2048 by default; pass246`--key-algorithm ecdsa-p256` for ECDSA):247248```bash249bash skills/splunk-platform-pki-setup/scripts/setup.sh \250 --phase render \251 --mode private \252 --target edge-processor \253 --include-edge-processor true \254 --ep-fqdn ep01.example.com \255 --ep-data-source-fqdn datasource01.example.com \256 --key-format pkcs8257```258259Run preflight against a live host (read-only checks; refuses to260apply):261262```bash263bash skills/splunk-platform-pki-setup/scripts/setup.sh \264 --phase preflight \265 --mode private \266 --target indexer-cluster,shc \267 --cm-fqdn cm01.example.com \268 --admin-password-file /tmp/splunk_admin_password269```270271Inventory live cert posture (read-only; never writes):272273```bash274bash skills/splunk-platform-pki-setup/scripts/setup.sh \275 --phase inventory \276 --target all \277 --admin-password-file /tmp/splunk_admin_password278```279280Apply rendered certs to a search head (mutates Splunk; requires281the explicit accept flag):282283```bash284bash skills/splunk-platform-pki-setup/scripts/setup.sh \285 --phase apply \286 --mode private \287 --target shc \288 --shc-deployer-fqdn deployer01.example.com \289 --leaf-target shc \290 --leaf-host sh01.example.com \291 --leaf-cert-file /tmp/signed/sh01.pem \292 --leaf-private-key-file /tmp/signed/sh01.key \293 --leaf-ca-bundle-file /tmp/signed/cabundle.pem \294 --accept-pki-rotation \295 --admin-password-file /tmp/splunk_admin_password \296 --leaf-key-password-file /tmp/pki_leaf_key_password297```298299Validate live state post-apply:300301```bash302bash skills/splunk-platform-pki-setup/scripts/validate.sh \303 --target indexer-cluster,shc \304 --cm-fqdn cm01.example.com \305 --admin-password-file /tmp/splunk_admin_password306```307308## What it renders309310Under the project root in `splunk-platform-pki-rendered/`:311312- `pki/private-ca/` — only when `--mode private`: `create-root-ca.sh`,313 `create-intermediate-ca.sh`, `sign-server-cert.sh`,314 `sign-client-cert.sh`, `sign-saml-sp.sh`, plus `openssl-*.cnf`315 files with the documented `basicConstraints` / `keyUsage` /316 `extendedKeyUsage` extensions, and a `README.md` that walks the317 operator through CA generation. Uses318 `$SPLUNK_HOME/bin/splunk cmd openssl genpkey/req/x509` per319 Splunk's documented workflow so the same OpenSSL build that320 Splunk uses signs and verifies.321- `pki/csr-templates/<role>-<host>.cnf` + `generate-csr.sh` —322 emitted in both modes; per-host CSR config with SANs and EKU.323- `pki/install/install-leaf.sh`, `verify-leaf.sh`,324 `kv-store-eku-check.sh`, `align-cli-trust.sh`,325 `install-fips-launch-conf.sh`, `prepare-key.sh` — cert326 install + verify per host. `kv-store-eku-check.sh` runs the327 documented `splunk cmd openssl verify -x509_strict` check from328 the KV Store custom-cert prep doc and refuses to declare a host329 ready unless the verification returns `OK`.330- `pki/distribute/cluster-bundle/master-apps/000_pki_trust/local/`331 — cluster-bundle drop-in: `server.conf` (with332 `[replication_port-ssl://9887]` if `--encrypt-replication-port=true`),333 `inputs.conf` (`[splunktcp-ssl:9997]` + `[SSL]`).334- `pki/distribute/shc-deployer/shcluster/apps/000_pki_trust/local/`335 — SHC deployer drop-in: `server.conf`, `web.conf`, `inputs.conf`.336- `pki/distribute/standalone/000_pki_trust/local/` — for337 non-clustered roles (LM, DS, MC, single SH, HF):338 `server.conf`, `web.conf`, `inputs.conf`, `outputs.conf`,339 `authentication.conf`, `deploymentclient.conf`,340 `splunk-launch.conf` (when FIPS), `system-files/ldap.conf`341 (when LDAPS).342- `pki/distribute/forwarder-fleet/<group>/{outputs-overlay.conf,server-overlay.conf}`343 — UF / HF outputs overlay with `clientCert` /344 `sslVerifyServerCert=true` / `sslVerifyServerName=true` and345 per-indexer `[tcpout-server://host:port]` SAN overrides.346- `pki/distribute/edge-processor/` — only when347 `--include-edge-processor=true`: 5-file PEM placeholders348 (`ca_cert.pem.example`, `edge_server_cert.pem.example`,349 `edge_server_key.pem.example`,350 `data_source_client_cert.pem.example`,351 `data_source_client_key.pem.example`) + `upload-via-rest.sh.example`352 for the EP REST upload and `README.md` for the EP UI walkthrough.353- `pki/distribute/saml-sp/` — only when `--saml-sp=true`:354 `sp-signing.crt`, `sp-signing.key.placeholder`, `README.md` for355 re-uploading IdP metadata after rotation.356- `pki/rotate/{plan-rotation.md, rotate-leaf-host.sh,357 swap-trust-anchor.sh, swap-replication-port-to-ssl.sh,358 expire-watch.sh}` — rotation helpers with the delegated359 rolling-restart runbook.360- `handoff/` — CA, Cloud, FIPS, Edge Processor, native expiry monitoring,361 optional legacy Splunkbase 3172, health, CIM, and operator checklists.362- `preflight.sh`, `validate.sh`, `inventory.sh`, `README.md`, `metadata.json`.363364## Certificate-Monitoring Guardrail365366SSL Certificate Checker (`3172`, app `ssl_certificate_checker`) stops at 9.4367and must not be installed on Cloud 10.5. Use `expire-watch.sh` plus368`inventory.sh`; see [post-install monitoring](references/post-install-monitoring.md).369370## Phases371372- `render` (default) — produce the reviewable rendered tree. No373 Splunk REST calls; safe to run anywhere.374- `preflight` — render then run the live preflight checks: cert375 directory permissions, default-cert refusal,376 KV-Store EKU verification (`splunk cmd openssl verify -x509_strict`377 must return `OK`), `splunk.secret` SHA-256 parity across cluster378 members, FIPS posture (refuses mid-Phase-1 / Phase-2 migration),379 hostname-validation gating, TLS protocol floor check380 (`sslVersions = tls1.2`), per-host381 `splunk btool server list sslConfig` snapshot, replication-port382 mode (cleartext vs SSL), `[shclustering]` `pass4SymmKey`383 presence reminder. Refuses to mark the deployment ready when any384 check fails.385- `apply` — render then run the local-host386 `pki/install/install-leaf.sh` + `align-cli-trust.sh` +387 `install-fips-launch-conf.sh` if FIPS. Requires388 explicit `--leaf-target`, `--leaf-host`, and `--leaf-ca-bundle-file`389 inputs, plus `--leaf-cert-file` and `--leaf-private-key-file` for every390 target except CA-only `ldaps`, and391 `--accept-pki-rotation` (a single-flag acknowledgement that the392 operator is about to swap serving certs and trigger downstream393 restart).394- `rotate` — render then emit a rotation runbook395 (`pki/rotate/plan-rotation.md`) describing the full delegated396 order. Does NOT exec the rolling restart itself (delegate397 pattern, see "Rotation ownership" below), and exits nonzero so398 rendering the runbook cannot be mistaken for a completed rotation.399- `validate` — render then run the live validation probes:400 REST + `openssl s_client -connect` per surface, KV Store401 handshake check, `splunk show-decrypted` round-trip on402 `sslPassword`, SAML SP signing cert exposed in IdP-metadata403 endpoint.404- `inventory` — read-only: collects405 `splunk btool server list sslConfig`, `web list sslConfig`,406 `inputs list http SSL`, dumps PEM expiry catalogue and emits407 `pki/inventory/<host>.json`. No Splunk write operations. No408 `--accept-…` required.409- `all` — render + one local-host leaf apply + installed-state preflight, then410 stop nonzero at the cluster-aware restart/rotation handoff. Run `validate` only after that411 restart completes. It uses the same explicit leaf inputs and412 `--accept-pki-rotation` gate.413414## Apply guard — `--accept-pki-rotation`415416The skill refuses to run `apply` or `all` without417`--accept-pki-rotation`. This is a single-flag acknowledgement418that:419420- The new cert chain has been verified (`verify-leaf.sh` returned421 `OK`).422- A rolling restart of the indexer cluster and SHC will follow423 (delegated to `splunk-indexer-cluster-setup --phase rolling-restart`).424- The SAML / LDAPS / Edge Processor / Splunk Cloud handoffs (where425 applicable) will be completed.426- The operator has a rollback plan (the previous PEM directory427 is preserved).428429The render and preflight phases never need this flag.430431## Rotation ownership — delegate432433The skill emits `pki/rotate/plan-rotation.md`, but does not run cluster434or SHC rolling restarts itself. Follow the canonical435[rotation runbook](references/rotation-runbook.md) for the exact staging,436bundle validation/apply, rolling-restart, SHC push, forwarder rollout,437validation, and rollback commands. That delegation preserves the438[`splunk-indexer-cluster-setup`](../splunk-indexer-cluster-setup/SKILL.md)439ownership model instead of duplicating restart orchestration here.440441## Handoffs and TLS Policy442443Read the [cross-skill ownership matrix](reference.md#cross-skill-ownership)444before delegating restarts, bundle pushes, token lifecycle, or fleet rollout.445TLS algorithms, protocol floors, FIPS lifecycle, validity caps, key formats,446and mTLS defaults are defined in [reference.md](reference.md#cross-cutting-controls)447and the topic files under [references/](references/authoritative-sources.md).448The renderer consumes the machine-readable449[algorithm policy](references/algorithm-policy.json) and fails closed on450deprecated protocols or incomplete FIPS transitions.451452## References453454Read [reference.md](reference.md) before any apply. Topical deep455dives (each anchored to a specific upstream Splunk doc captured in456[references/authoritative-sources.md](references/authoritative-sources.md)):457458- [references/component-cert-matrix.md](references/component-cert-matrix.md)459- [references/private-pki-workflow.md](references/private-pki-workflow.md)460- [references/public-pki-workflow.md](references/public-pki-workflow.md)461- [references/handoff-vault-pki.md](references/handoff-vault-pki.md)462- [references/handoff-acme-cert-manager.md](references/handoff-acme-cert-manager.md)463- [references/handoff-microsoft-adcs.md](references/handoff-microsoft-adcs.md)464- [references/handoff-ejbca.md](references/handoff-ejbca.md)465- [references/kv-store-eku-requirements.md](references/kv-store-eku-requirements.md)466- [references/mtls-and-hostname-validation.md](references/mtls-and-hostname-validation.md)467- [references/replication-port-tls.md](references/replication-port-tls.md)468- [references/saml-signing-certs.md](references/saml-signing-certs.md)469- [references/ldaps-trust.md](references/ldaps-trust.md)470- [references/edge-processor-pki.md](references/edge-processor-pki.md)471- [references/cli-trust-cacert-alignment.md](references/cli-trust-cacert-alignment.md)472- [references/tls-protocol-policy.md](references/tls-protocol-policy.md)473- [references/algorithm-presets.md](references/algorithm-presets.md)474 + [algorithm-policy.json](references/algorithm-policy.json) (machine-readable companion consumed by renderer + preflight)475- [references/fips-and-common-criteria.md](references/fips-and-common-criteria.md)476- [references/key-format-and-permissions.md](references/key-format-and-permissions.md)477- [references/rotation-runbook.md](references/rotation-runbook.md)478- [references/post-install-monitoring.md](references/post-install-monitoring.md)479- [references/splunk-cloud-ufcp-handoff.md](references/splunk-cloud-ufcp-handoff.md)480- [references/troubleshooting.md](references/troubleshooting.md)481- [references/authoritative-sources.md](references/authoritative-sources.md)