Security Basics
KiloCenter security basics — default credentials to change, TLS cert paths, and minimum hardening for shared deploys.
Goal
Establish a secure baseline for KiloCenter deployments.
Default Credentials
Local development includes convenience credentials that must be changed for any shared or production environment:
PostgreSQL
user kilocenter, password changeme
Change in config.yaml and Docker Compose
MQTT broker
user admin, password KiloCenter
Change in Mosquitto config and config.yaml
TLS for Base Station and Application Center Communication
BSSCI requires TLS 1.2 or higher. SCACI requires TLS 1.3 or higher. Every connection to KC-Core uses TLS encryption.
CA Trust Model
KiloCenter uses a self-signed Certificate Authority (CA) to issue all certificates:
CA certificate
Root of trust; distributed to base stations
20 years
certificates/ca.crt
CA private key
Signs server and client certificates
--
certificates/ca.key
Server certificate
KC-Core BSSCI/SCACI TLS listeners
1 year
certificates/server.crt
Server private key
TLS handshake
--
certificates/server.key
Client certificate
Per-base-station mutual TLS (optional)
1 year
Generated on demand
Base stations trust the CA certificate, not individual server certificates. This means server certificates can be renewed without touching base stations, as long as the same CA signs them.
If you regenerate the CA, all existing server and client certificates become invalid and must be reissued. Back up ca.key securely.
Generating Certificates
Generate CA + Server Certificates (first-time setup)
No host Go toolchain required — use the certgen compose service:
File ownership (Linux): If generated files are owned by root, rerun with
UID=$(id -u) GID=$(id -g)prefixed.
For a production FQDN:
This creates four files in KC-Core/certificates/:
ca.crtandca.key-- CA certificate and private keyserver.crtandserver.key-- server certificate and private key
The server certificate automatically includes localhost, 127.0.0.1, 0.0.0.0, and all local network IPs as Subject Alternative Names (SANs).
Generate a Client Certificate
certgen Reference
-dir
certs
Output directory for certificate files
-server
localhost
Server hostname (used as CN and SAN)
-days
365
Server/client certificate validity in days
-ca-years
20
CA certificate validity in years
-ca-only
false
Generate only the CA certificate
-server-only
false
Generate only the server certificate (CA must already exist)
-client-only
false
Generate only a client certificate (CA must already exist)
-client
(empty)
Client name for client certificate (e.g., base station EUI)
Common Scenarios
Renew server certificate only (CA already exists):
Certificate Rotation
Via compose (recommended for automation):
Via GUI (post-install renewal):
Open KC-Web and navigate to Certificates.
Click Renew Server Certificates and confirm.
Restart KC-Core to load the new certificates.
After rotation:
Restart KC-Core to load the new certificates.
Verify base station reconnections succeed.
If the CA was changed, redistribute
ca.crtto all base stations.
Certificate Configuration
KC-Core loads certificates from paths configured in config.yaml (source dev) or config/config.docker.yaml (container):
Paths in source dev mode are relative to the KC-Core working directory. KC-Core will fail to start if these files are missing.
Network Exposure
Limit which ports are accessible from outside your local network:
5000
BSSCI
Only base station networks
5001
SCACI
Only application center hosts
9090
KC-Gateway (gRPC-web)
Operator and API consumer networks
80
KC-Web (container)
Operator networks only
50051
KC-Core internal gRPC
Loopback only, never expose externally
5433
PostgreSQL
Loopback only
6379
Redis
Loopback only
1883
MQTT
Only MQTT consumer networks
Hardening Checklist
Enterprise Edition
The Enterprise Edition adds multi-tenant security features:
User authentication with JWT validation
Organization-scoped data isolation
Role-based access control
These features are not available in the Community Edition.
Last updated