Securing Splunk End-to-End with Custom Certificates
By 2017, relying on Splunk’s default self-signed certificates wasn’t sufficient for any serious production environment. Whether you were dealing with regulatory frameworks like FedRAMP or just internal security policy, you needed to replace default certs across every connection surface.
This post outlines how we implemented internal PKI-backed TLS across Universal Forwarders, Deployment Server, Indexers, Search Heads, and Web UI. It covers certificate placement, config examples, validation tips, and failure points.
Why Replace Splunk's Default Certs
- Default certs are self-signed and shared across installs
- No trust chain = warnings and audit failures
- Can't support client verification
- Impossible to manage at scale
What Needs to Be Secured
- Universal Forwarders ➝ Deployment Server (8089)
- Universal Forwarders ➝ Indexers (9997)
- Search Heads ➝ Indexers (management and search)
- Web interface (8000)
- Indexer Cluster comms
- API and REST interfaces
Certificate Types
We used:
- A single internal CA
- Unique certs per host role (uf
, idx
, sh
, ds
, web
)
- Full PEM chain bundles (leaf, intermediate, root)
- Encrypted private keys where required
Each cert was stored at:
$SPLUNK_HOME/etc/auth/certs/<role>.pem
$SPLUNK_HOME/etc/auth/certs/internal-rootCA.pem
Config Sections
Universal Forwarder ➝ Deployment Server (deploymentclient.conf
)
```ini [deployment-client] clientName = uf01.company.com
[target-broker:deploymentServer] targetUri=https://splunk-ds.internal.company.com:8089
[sslConfig] sslRootCAPath = $SPLUNK_HOME/etc/auth/certs/internal-rootCA.pem sslVerifyServerCert = true ```
Universal Forwarder ➝ Indexers (outputs.conf
)
ini
[tcpout:indexer_group]
server = idx1.internal.company.com:9997
sslCertPath = $SPLUNK_HOME/etc/auth/certs/uf.pem
sslPassword = $1$YourEncryptedPassword
sslRootCAPath = $SPLUNK_HOME/etc/auth/certs/internal-rootCA.pem
sslVerifyServerCert = true
Indexer Configuration (server.conf
and inputs.conf
)
ini
[sslConfig]
enableSplunkdSSL = true
serverCert = $SPLUNK_HOME/etc/auth/certs/indexer.pem
sslRootCAPath = $SPLUNK_HOME/etc/auth/certs/internal-rootCA.pem
sslVerifyClient = true
ini
[splunktcp-ssl:9997]
disabled = 0
requireClientCert = true
Web Interface (web.conf
)
ini
[settings]
enableSplunkWebSSL = true
serverCert = $SPLUNK_HOME/etc/auth/certs/web.pem
sslRootCAPath = $SPLUNK_HOME/etc/auth/certs/internal-rootCA.pem
Operational Notes
- Certs must include the full chain if your CA uses intermediates
- Permissions on cert and key files must allow Splunk user read access
- Restart Splunk after applying cert changes
- Validate with:
bash
openssl s_client -connect idx1.internal.company.com:9997
Common Errors
| Symptom | Likely Cause |
|---------|---------------|
| "unknown CA" | Missing rootCA or broken chain |
| Forwarder won't connect | Hostname mismatch or sslVerifyServerCert=true
|
| Web UI down | Incorrect file path or unreadable key |
| Internal components fail to handshake | Cert mismatch or server restarted without reload |
Lessons Learned
- Secure from day one—retrofits are painful and high risk
- Use naming conventions for cert files by role and hostname
- Schedule cert rotation with automation and validation
- Always test on lower-tier environments before global rollout
Once we implemented this across the environment, our posture improved significantly. It also allowed us to meet internal compliance requirements with minimal recurring maintenance beyond cert renewals.
Comments
Post a Comment