Keycloak 配置参数详解
kc.sh 子命令与 KC_* 环境变量逐参数详解:官方默认值、生效实测回显与生产配置模板。
Keycloak 配置参数详解
> 目标:逐参数讲清 Keycloak 26.8.1 的 kc.sh 子命令体系与 KC_* 环境变量(数据库、主机名、HTTP、代理、TLS、管理员引导、可观测七类),每个关键参数均给出官方默认值与真实生效回显,并还原生产模式启动的三步排障实录,全部在 Ubuntu 22.04 服务器实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04(x86_64)
- Keycloak:26.8.1,安装目录
/opt/keycloak(官方 tar.gz 解压安装,二进制入口/opt/keycloak/bin/kc.sh) - Java:OpenJDK 21.0.12.1+1-LTS(Keycloak 26 要求 JDK 21)
- 默认端口:8080(HTTP)、8443(HTTPS)、9000(管理与指标接口)
- 数据目录:
/opt/keycloak/data
二、前置条件
2.1 安装与版本确认
Keycloak 26.x 发行物自带优化运行时,无需单独安装应用服务器,只需 JDK 21。官方下载地址形如 https://github.com/keycloak/keycloak/releases/download/26.8.1/keycloak-26.8.1.tar.gz(约 166MB),解压到 /opt/keycloak 后即可使用。确认安装与版本:
/opt/keycloak/bin/kc.sh --version
实测回显:
Keycloak 26.8.1
JVM: 21.0.12.1 (Red Hat, Inc. OpenJDK 64-Bit Server VM 21.0.12.1+1-LTS)
OS: Linux 6.8.0-138-generic amd64
2.2 参数的三种配置途径与优先级
同一参数有三处可配,优先级从高到低为:命令行参数 → 环境变量 → keycloak.conf 配置文件。三者只是书写形态不同,参数本体一致:
| 途径 | 书写形态 | 示例(HTTP 端口) | 适用 |
|---|---|---|---|
| 命令行参数 | --<小写连字符> | kc.sh start --http-port=8081 | 一次性覆盖 |
| 环境变量 | KC_ + 下划线大写 | KC_HTTP_PORT=8081 | 服务托管、编排文件 |
| 配置文件 | 小写连字符键值 | http-port=8081(conf/keycloak.conf) | 固定部署 |
💡 说明:环境变量名规则是
--http-port去掉两个横线、下划线连接并全大写,即KC_HTTP_PORT;--db-url对应KC_DB_URL。本篇后续每个参数都同时给出两种形态。
三、参数查看与修改方式
3.1 用 --help 查看参数与默认值
查看某个子命令的完整参数与官方默认值(以 start 为例,全文 729 行,此处节选):
/opt/keycloak/bin/kc.sh start --help
实测回显(节选):
--db <vendor> The database vendor. In production mode the default value of 'dev-file' is
deprecated, you should explicitly specify the db instead. Possible values
are: dev-file, dev-mem, mariadb, mssql, mysql, oracle, postgres, tidb.
Default: dev-file.
--db-connect-timeout <timeout>
Sets the JDBC driver connection timeout and login timeout. May be an ISO 8601
duration value, an integer number of seconds, or an integer followed by one
of [ms, h, m, s, d]. Default: 10s.
💡 说明:
--help是默认值的唯一权威来源——help 里写Default:的就是当前版本真实默认值,不随文档记忆漂移。开发模式(start-dev)与生产模式(start)可用的参数集合不同,分别用start-dev --help与start --help查看。
3.2 用 show-config 查看当前生效配置
/opt/keycloak/bin/kc.sh show-config
实测回显(节选):
Current Mode: production
Current Configuration:
kc.log-console-output = default (classpath application.properties)
kc.version = 26.8.1 (SysPropConfigSource)
kc.log-file = /opt/keycloak/bin/../data/log/keycloak.log (classpath application.properties)
逐行解读:Current Mode 显示当前按开发/生产哪种模式解析(直接运行 show-config 默认按 production 解析);每行末尾括号标注该值来自哪个配置源(classpath application.properties 为内置默认、ENV 为环境变量、SysPropConfigSource 为系统属性)。排障时先用它确认"我设置的值到底生效没有"。
四、kc.sh 子命令总览
/opt/keycloak/bin/kc.sh --help
实测回显(节选,命令清单部分):
Commands:
build Creates a new and optimized server image.
start Start the server.
start-dev Start the server in development mode.
export Export data from realms to a file or directory.
import Import data from a directory or a file.
show-config Print out the current configuration.
tools Utilities for use and interaction with the server.
completion Generate bash/zsh completion script for kc.sh.
build-password-denylist
Pre-compute a Bloom filter for a password denylist.
bootstrap-admin Commands for bootstrapping admin access
user Add an admin user with a password
service Add an admin service account
update-compatibility [Preview] Tool for configuration compatibility.
check Checks if the metadata is compatible with the current
configuration. A zero exit code means a rolling
update is possible between old and the current
metadata.
metadata Stores the metadata necessary to determine if a
configuration is compatible.
逐个说明日常使用频率最高的五个子命令:start-dev(开发模式启动,跳过 hostname/TLS 约束,H2 内存/文件库)、start(生产模式启动,强制完整配置)、build(预编译优化运行时,配合 start --optimized 缩短启动时间)、export/import(域数据导出导入,迁移与备份用)。下面给出 export/import 的实测形态。
4.1 export:导出域数据
/opt/keycloak/bin/kc.sh export --dir /tmp/kc-export
实测回显(节选):
2026-10-17 09:25:40,244 INFO [org.keycloak.services] (main) KC-SERVICES0033: Full model export requested
2026-10-17 09:25:40,539 INFO [org.keycloak.exportimport.dir.DirExportProvider] (main) Exporting into directory /tmp/kc-export
2026-10-17 09:25:40,575 INFO [org.keycloak.exportimport.dir.DirExportProvider] (main) Realm 'quzuo-demo' - data exported
2026-10-17 09:25:40,741 INFO [org.keycloak.exportimport.dir.DirExportProvider] (main) Realm 'master' - data exported
2026-10-17 09:25:40,782 INFO [org.keycloak.exportimport.dir.DirExportProvider] (main) Users 0 - 0 exported
2026-10-17 09:25:40,787 INFO [org.keycloak.services] (main) KC-SERVICES0035: Export finished successfully
导出产物为每域一个 JSON:
-rw-r--r-- 1 keycloak root 86243 Oct 17 09:25 master-realm.json
-rw-r--r-- 1 keycloak root 981 Oct 17 09:25 master-users-0.json
-rw-r--r-- 1 keycloak root 79044 Oct 17 09:25 quzuo-demo-realm.json
4.2 import:启动时导入域数据
把导出的 quzuo-demo-realm.json 放入 <安装目录>/data/import/,启动时追加 --import-realm:
/opt/keycloak/bin/kc.sh start-dev --import-realm
实测回显(节选):
INFO [org.keycloak.exportimport.dir.DirImportProvider] (main) Importing from directory /opt/keycloak/bin/../data/import
INFO [org.keycloak.services] (main) KC-SERVICES0030: Full model import requested. Strategy: IGNORE_EXISTING
INFO [org.keycloak.exportimport.util.ImportUtils] (main) Realm 'quzuo-demo' imported
INFO [org.keycloak.services] (main) KC-SERVICES0032: Import finished successfully
💡 说明:导入策略为
IGNORE_EXISTING——同名域已存在时跳过不覆盖,所以该方式适合初始化新环境,不适合更新既有域。
五、核心参数分类详解
5.1 数据库类:KC_DB / KC_DB_URL / KC_DB_USERNAME / KC_DB_PASSWORD
Keycloak 开箱使用 H2 文件库(仅适合开发),生产必须换关系库。--help 实测的官方说明:--db 可选值为 dev-file, dev-mem, mariadb, mssql, mysql, oracle, postgres, tidb,生产模式默认值 dev-file 已废弃、必须显式指定;JDBC 连接超时 --db-connect-timeout 默认 10s。PostgreSQL 形态的环境变量写法:
export KC_DB=postgres
export KC_DB_URL="jdbc:postgresql://localhost:5432/keycloak"
export KC_DB_USERNAME=keycloak
export KC_DB_PASSWORD=q1w2e3r4
💡 技术拓展:
KC_DB_URL与四要素简化写法的取舍——
写法 说明 适用 仅 KC_DB + KC_DB_USERNAME/PASSWORD Keycloak 按默认规则拼 JDBC URL 库名/端口符合默认(keycloak@5432) 显式 KC_DB_URL 完整控制主机/端口/库名/连接参数 非默认端口、需要 SSL/连接池参数 KC_DB_SCHEMA 指定 schema(默认 public) 多组件共用一个库时 生产推荐显式
KC_DB_URL,把?ssl=true等连接参数的控制权留在自己手里。
5.2 主机名类:KC_HOSTNAME / KC_HOSTNAME_STRICT(Hostname v2)
26.x 默认启用 Hostname v2。--help 实测原文:--hostname 接受完整 URL 或仅主机名,是服务对外暴露地址的基准(token 的 issuer、前端 URL、回调校验都由它派生);--hostname-strict 默认 true,禁止从请求头动态推断主机名。生产模式不配 hostname 会被直接拒绝启动:
ERROR: Failed to start server in (production) mode
ERROR: hostname is not configured; either configure hostname, or set hostname-strict to false
⚠️ 注意:旧版本的
hostname-strict-https参数在 Hostname v2 下已被取代,不要照抄旧文档;若确需 HTTP 访问,用 5.3 节的KC_HTTP_ENABLED=true,并确保 TLS 终结在代理层。
5.3 HTTP 与端口:KC_HTTP_ENABLED / KC_HTTP_PORT / KC_HTTP_HOST
--help 实测原文:--http-enabled 生产模式默认 false("Enabled by default in development mode. Typically not enabled in production unless the server is fronted by a TLS termination proxy");--http-port 默认 8080;--http-host 生产模式默认绑定 0.0.0.0。
KC_HTTP_PORT 生效实测(改为 8081 启动后验证监听与访问):
KC_HTTP_PORT=8081 /opt/keycloak/bin/kc.sh start-dev
实测回显:
2026-10-17 09:20:17,696 INFO [io.quarkus] (main) Keycloak 26.8.1 on JVM (powered by Quarkus 3.40.1) started in 10.484s. Listening on: http://0.0.0.0:8081
curl -s -o /dev/null -w 'localhost:8081 → HTTP %{http_code}\n' http://localhost:8081/
实测回显:
localhost:8081 → HTTP 302
⚠️ 注意:KC_HTTP_ENABLED=true 只在"HTTPS 由前置代理终结"的部署中开启;裸暴露 HTTP 的生产 Keycloak 会因缺少安全上下文导致部分功能(如跨域 Cookie)异常,启动日志中也会给出 insecure context 警告。
5.4 代理类:KC_PROXY_HEADERS(KC_PROXY 已废弃)
反向代理场景必须让 Keycloak 正确解析 X-Forwarded-*/Forwarded 头,否则生成的 issuer/回调地址会变成代理的内网地址。--help 实测原文:
--proxy-headers <headers>
The proxy headers that should be accepted by the server. Misconfiguration
might leave the server exposed to security vulnerabilities. Takes precedence
over the deprecated proxy option. Possible values are: forwarded, xforwarded.
💡 技术拓展:两种代理头标准对比——
方案 头格式 采用方 xforwarded X-Forwarded-For/Proto/Host/Port 一组头 Nginx/Apache/绝大多数代理(常用) forwarded 单一 Forwarded 头携带全部信息 较新代理与网关 旧参数
KC_PROXY(edge/repackage/passthrough 三值)已废弃,被KC_PROXY_HEADERS取代;升级部署时务必替换,否则新版本会忽略旧变量。
5.5 TLS 证书:KC_HTTPS_CERTIFICATE_FILE / KC_HTTPS_CERTIFICATE_KEY_FILE
不经过代理直接对外提供 HTTPS 时,配置 PEM 格式证书与私钥:
export KC_HTTPS_CERTIFICATE_FILE=/opt/keycloak/conf/tls/fullchain.pem
export KC_HTTPS_CERTIFICATE_KEY_FILE=/opt/keycloak/conf/tls/privkey.pem
配套参数 --https-certificates-reload-period 默认 1h(证书文件变更后的小时级自动重载,设 -1 关闭)。配好证书后不再需要 KC_HTTP_ENABLED,Keycloak 直接以 HTTPS 监听。
5.6 管理员引导:KC_BOOTSTRAP_ADMIN_USERNAME / KC_BOOTSTRAP_ADMIN_PASSWORD
首启创建 master 域临时管理员的标准方式(环境变量与 --bootstrap-admin-username/--bootstrap-admin-password 等价):
export KC_BOOTSTRAP_ADMIN_USERNAME=admin
export KC_BOOTSTRAP_ADMIN_PASSWORD=q1w2e3r4
--help 实测原文注明该用户"仅在 master realm 创建时生效"(Used only when the master realm is created),此后改这两个变量不会再改密码。不设置这两个变量时实测启动日志中不会出现任何 admin 相关创建记录,首次登录管理台前需用交互式子命令补建:
/opt/keycloak/bin/kc.sh bootstrap-admin user
按提示输入用户名与密码即可(也支持 bootstrap-admin service 创建服务账号形态的管理凭据)。
5.7 可观测:KC_HEALTH_ENABLED / KC_METRICS_ENABLED
两者默认均为 false。开启后 Keycloak 在独立管理端口(默认 9000)暴露 /health 与 /metrics,供负载均衡探活与监控抓取,不占用 8080 业务端口。验证形态:
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost:9000/health
💡 说明:健康检查与业务端口分离是 25.x 起的默认设计,负载均衡的健康探测应指向 9000 而非 8080。
六、生产配置模板
6.1 推荐配置(PostgreSQL + 代理终结 TLS,8GB 内存服务器适用)
写入 /opt/keycloak/conf/keycloak.conf(等价的环境变量形态见右侧注释):
# 数据库(等价 KC_DB / KC_DB_URL / KC_DB_USERNAME / KC_DB_PASSWORD)
db=postgres
db-url=jdbc:postgresql://localhost:5432/keycloak
db-username=keycloak
db-password=q1w2e3r4
# 主机名(等价 KC_HOSTNAME)
hostname=sso.quzuo.net
# HTTPS 证书(等价 KC_HTTPS_CERTIFICATE_FILE / KC_HTTPS_CERTIFICATE_KEY_FILE)
https-certificate-file=/opt/keycloak/conf/tls/fullchain.pem
https-certificate-key-file=/opt/keycloak/conf/tls/privkey.pem
# 健康检查(等价 KC_HEALTH_ENABLED / KC_METRICS_ENABLED)
health-enabled=true
metrics-enabled=true
适用场景:单机或主备形态、PostgreSQL 独立部署、前端有 Nginx/负载均衡终结 TLS;磁盘预留 20GB 以上(日志 + 库空间另计)。
6.2 生产启动三步排障实录
生产模式启动对配置完整性有硬校验,以下三步是真实排障路径,读者按报错逐层补配置即可:
第 1 步:只给数据库配置启动 → 报缺 HTTPS 证书或 http-enabled。
WARNING: With HTTPS not enabled, `proxy-headers` unset, and `hostname-strict=false`, the server is running in an insecure context. ...
Key material not provided to setup HTTPS. Please configure your keys/certificates, or if HTTPS access is not needed see the `http-enabled` option. If you meant to start the server in development mode, see the `start-dev` command.
第 2 步:加了 KC_HTTP_ENABLED=true 但未配 hostname → 报 hostname 缺失。
ERROR: Failed to start server in (production) mode
ERROR: hostname is not configured; either configure hostname, or set hostname-strict to false
第 3 步:补齐 KC_HOSTNAME 后启动成功。
2026-10-17 09:15:45,276 INFO [io.quarkus] (main) Keycloak 26.8.1 on JVM (powered by Quarkus 3.40.1) started in 15.919s. Listening on: http://0.0.0.0:8080
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://localhost:8080/realms/master/.well-known/openid-configuration
实测回显:
HTTP 200
6.3 build + --optimized:生产启动提速
start 默认每次启动前自动执行一次 build 校验配置变更;固定配置的机器可预先 build 一次,之后用 --optimized 跳过该步骤显著缩短启动时间。build 实测:
KC_DB=postgres KC_DB_URL='jdbc:postgresql://db:5432/keycloak' \
KC_DB_USERNAME=keycloak KC_DB_PASSWORD=q1w2e3r4 \
/opt/keycloak/bin/kc.sh build
实测回显:
Server configuration updated and persisted. Run the following command to review the configuration:
kc.sh show-config
之后启动:
/opt/keycloak/bin/kc.sh start --optimized
--help 实测原文同时提醒:build 之后若再改配置,需重新 build,否则新配置不会生效——这是 --optimized 唯一的坑。
七、常见问题
Q1:启动直接报 hostname is not configured? 见 6.2 第 2 步实录。生产模式必须配置 KC_HOSTNAME(或显式 hostname-strict=false,不推荐),它同时决定 token issuer 与前端地址,不要留空。
Q2:报 Key material not provided to setup HTTPS? 生产模式默认要求 TLS:要么配 5.5 节的证书,要么确认 TLS 由前置代理终结并显式设置 KC_HTTP_ENABLED=true(6.2 第 1 步实录)。开发验证环境直接用 start-dev。
Q3:设置了 KC_BOOTSTRAP_ADMIN_ 但没生效?* 该变量只在 master 域首次创建时起作用(5.6 节 help 原文)。库中已有 master 域后要重置管理员密码,走 Admin API 的 reset-password 或 kc.sh bootstrap-admin user 交互命令。
Q4:改了参数但不生效? 按优先级排查:命令行参数 > 环境变量 > keycloak.conf;再确认是否用了 --optimized 启动(改配置后必须重新 kc.sh build);最后用 kc.sh show-config 直接查看生效值与其来源(3.2 节)。
Q5:start 与 start-dev 的行为差异记不住? 记两条硬边界:start-dev 默认开 HTTP、免 hostname、免证书、H2 存储;start 全部反向硬校验(hostname、HTTPS 或 http-enabled、必须指定真实数据库)。任何"生产可跑但 dev 跑不起来"的问题基本都是 dev 少了管理凭据变量(5.6)。
八、参考链接
- Keycloak Server Configuration Guide(全部参数与默认值):https://www.keycloak.org/documentation
- Hostname v2 说明与迁移:https://www.keycloak.org/docs/latest/server_admin/index.html
- 本专栏相关篇目:《Keycloak Docker Compose 部署指南》(KC_* 变量在编排文件中的落地)、《Keycloak Admin API 使用详解》(服务可用后的管理操作)
- 相关文档:《Vaultwarden 1.37.4 配置参数详解》《OpenBao Docker Compose 部署指南》