3.9. 配置 realm 键
红帽构建的 Keycloak 使用的身份验证协议需要加密签名,有时加密。红帽 Keycloak 的构建使用非对称密钥对(私钥和公钥)来实现这一目的。
Red Hat build of Keycloak 一次有一个活跃的密钥对,但也可以有多个被动键。主动密钥对用于创建新签名,而被动密钥对则可用于验证之前的签名。这样,可以在不停机或中断用户的情况下定期轮转密钥。
创建域时,会自动生成密钥对和自签名证书。
流程
- 单击菜单中的 Realm settings。
- 点 Keys。
- 从过滤器下拉菜单中选择 被动密钥,以查看被动密钥。
- 从过滤器下拉菜单中选择 Disabled 密钥,以查看禁用的密钥。
密钥对的状态可以是 Active
,但仍然不能选为域的当前活动密钥对。所选用于签名的活跃对基于提供活跃密钥对的第一个密钥提供商选择。
3.9.1. 轮转密钥
我们建议您定期轮转密钥。首先,创建优先级高于现有活动密钥的新密钥。取而代之,您可以创建具有相同优先级的新密钥,并使之前密钥被动设置为被动。
有新密钥可用后,所有新令牌和 Cookie 将用新密钥签名。当用户向应用进行身份验证时,SSO cookie 将使用新签名进行更新。当 OpenID Connect 令牌被刷新新令牌时,会使用新密钥签名。最后,所有 Cookie 和令牌都使用新密钥,并在一个后删除旧密钥。
删除旧密钥的频率是安全性之间的权衡,并确保更新了所有 Cookie 和令牌。在创建新密钥后,请考虑每三个到六个月创建新密钥,并将旧密钥一到 2 个月。如果用户在添加的新密钥和要删除的旧密钥之间的期间不活跃,用户必须重新验证。
轮转密钥也适用于离线令牌。为确保更新它们,应用程序需要刷新令牌,然后才能删除旧密钥。
3.9.2. 添加生成的密钥对
使用这个流程生成包含自签名证书的密钥对。
流程
- 在 Admin Console 中选择 realm。
- 单击菜单中的 Realm settings。
- 点 Keys 选项卡。
- 单击 Providers 选项卡。
- 单击 Add provider,再选择 rsa-generated。
- 在 Priority 字段中输入数字。此数字决定了新密钥对是否成为活跃密钥对。最高数字使密钥对处于活动状态。
- 为 AES Key size 选择一个值。
- 点击 Save。
更改提供程序的优先级不会导致密钥被重新生成,但如果要更改 keysize,您可以编辑提供程序,并将生成新密钥。
3.9.3. 通过提取证书来轮转密钥
您可以通过从 RSA 生成的密钥对中提取证书并在新密钥存储中使用该证书来轮转密钥。
先决条件
- 生成的密钥对
流程
- 在 Admin Console 中选择 realm。
- 单击 Realm Settings。
点 Keys 选项卡。
此时会出现活跃 密钥 列表。
在带有 RSA 密钥的行中,单击 Public Keys 下的 Certificate。
证书以文本形式显示。
将证书保存到文件中,并将其放在这些行中。
----Begin Certificate---- <Output> ----End Certificate----
- 使用 keytool 命令将密钥文件转换为 PEM 格式。
从密钥存储中删除当前的 RSA 公钥证书。
keytool -delete -keystore <keystore>.jks -storepass <password> -alias <key>
将新证书导入到密钥存储中
keytool -importcert -file domain.crt -keystore <keystore>.jks -storepass <password> -alias <key>
重新构建应用程序。
mvn clean install wildfly:deploy
3.9.4. 添加现有密钥对和证书
要添加在别处获取的密钥对和证书,请选择 Providers
,然后从下拉菜单中选择 rsa
。您可以更改优先级,以确保新密钥对成为活跃的密钥对。
先决条件
- 私钥文件。该文件必须采用 PEM 格式。
流程
- 在 Admin Console 中选择 realm。
- 单击 Realm settings。
- 点 Keys 选项卡。
- 单击 Providers 选项卡。
- 单击 Add provider,然后选择 rsa。
- 在 Priority 字段中输入数字。此数字决定了新密钥对是否成为活跃密钥对。
- 点 Private RSA Key 旁边的 Browse… 来上传私钥文件。
- 如果您的私钥有签名证书,请点击 X509 Certificate 旁边的 Browse… 来上传证书文件。如果没有上传证书,Red Hat build of Keycloak 会自动生成自签名证书。
- 点击 Save。
3.9.5. 从 Java Keystore 加载密钥
要添加存储在主机上的 Java Keystore 文件中的密钥对和证书,请选择 Providers
,然后从下拉菜单中选择 java-keystore
。您可以更改优先级,以确保新密钥对成为活跃的密钥对。
要加载关联的证书链,必须将其导入到用于加载密钥对的同一 Key Alias
的 Java 密钥存储文件中。
流程
- 在 Admin Console 中选择 realm。
- 单击菜单中的 Realm settings。
- 点 Keys 选项卡。
- 单击 Providers 选项卡。
- 点 Add provider 并选择 java-keystore。
- 在 Priority 字段中输入数字。此数字决定了新密钥对是否成为活跃密钥对。
-
输入所需的 算法。请注意,该算法应与密钥类型匹配(例如
RS256
需要 RSA 私钥、ES256
一个 EC 私钥或AES
AES secret 密钥)。 - 为 Keystore 输入一个值。密钥存储文件的路径。
- 输入 Keystore Password。选项可以引用来自外部 密码库 的值。
-
为 Keystore Type (
JKS
、PKCS12
或BCFKS
)输入一个值。 - 为 Key Alias 输入一个从密钥存储加载的值。
- 输入 密钥密码。选项可以引用来自外部 密码库 的值。
-
为 Key Use 输入一个值(
sig
用于签名或加密
使用)。请注意,使用应与算法类型匹配(例如RS256
为sig
,但RSA-OAEP
为enc
) - 点击 Save。
并非所有密钥存储类型都支持所有类型的密钥。例如,在 fips 模式(BCFIPS
供应商)中所有模式和 PKCS12
的 JKS
无法存储 secret 密钥条目。
3.9.6. 使键被动
流程
- 在 Admin Console 中选择 realm。
- 单击菜单中的 Realm settings。
- 点 Keys 选项卡。
- 单击 Providers 选项卡。
- 点击您要进行被动的密钥的供应商。
- 将 Active 切换到 Off。
- 点击 Save。
3.9.7. 禁用键
流程
- 在 Admin Console 中选择 realm。
- 单击菜单中的 Realm settings。
- 点 Keys 选项卡。
- 单击 Providers 选项卡。
- 点击您要进行被动的密钥的供应商。
- 将 Enabled 切换到 Off。
- 点击 Save。
3.9.8. 被入侵的密钥
红帽构建的 Keycloak 有本地存储于本地的签名密钥,它们永远不会与客户端应用程序、用户或其他实体共享。但是,如果您认为您的域签名密钥已被破坏,您应当首先按照上述方式生成新的密钥对,然后立即删除被入侵的密钥对。
或者,您也可以从 Providers
表中删除提供程序。
流程
- 点菜单中的 Clients。
- 单击 security-admin-console。
- 向下滚动到 Access settings 部分。
- 填写 Admin URL 字段。
- 单击 Advanced 选项卡。
- 在 Revocation 部分点 Set to now。
- 单击 Push。
推送 not-before 策略可确保客户端应用程序不接受受入侵密钥签名的现有令牌。客户端应用程序被强制从红帽构建的 Keycloak 下载新密钥对,因此被入侵的密钥签名的令牌将无效。
REST 和机密客户端必须设置 Admin URL,以便红帽构建的 Keycloak 可以向推送的非前策略请求发送客户端。