3.9. 配置 realm 密钥
红帽构建的 Keycloak 使用的身份验证协议需要加密签名,有时加密。红帽构建的 Keycloak 使用非对称密钥对(一个私钥和公钥)来实现这一点。
红帽构建的 Keycloak 一次有一个活跃的密钥对,但也可以有多个被动密钥。主动密钥对用于创建新签名,而被动密钥对则可用于验证之前的签名。这样,可以定期轮转密钥,而无需向用户停机或中断。
创建域时,会自动生成密钥对和自签名证书。
流程
- 点菜单中的 Realm settings。
- 点 Keys。
- 从过滤器下拉菜单中选择 Passive 键来查看被动密钥。
- 从过滤器下拉菜单中选择 Disabled 键 来查看禁用的密钥。
密钥对可以具有 Active
状态,但仍然不能选择为该域的当前活动密钥对。所选用于签名的活动对会根据提供活跃密钥对的优先级排序的第一个密钥提供程序来选择。
3.9.1. 轮转密钥
我们建议您定期轮转密钥。首先,创建优先级高于现有活动密钥的新密钥。您可以使用相同的优先级创建新密钥,并将以前的密钥设置为被动。
有新密钥可用后,所有新令牌和 Cookie 将用新密钥签名。当用户向应用进行身份验证时,SSO cookie 将使用新签名进行更新。当刷新 OpenID Connect 令牌时,使用新密钥签名新令牌。最后,所有 Cookie 和令牌都使用新密钥,并在可以删除旧密钥时之后使用。
删除旧密钥的频率是安全性之间的权衡,并确保所有 Cookie 和令牌都已更新。考虑每三到六个月创建新密钥,并在创建新密钥后将旧密钥删除至两个月。如果用户在添加新密钥和删除的旧密钥之间的期间不活跃,则该用户必须重新验证。
轮转密钥也适用于离线令牌。为确保它们已更新,应用程序需要在删除旧密钥前刷新令牌。
3.9.2. 添加生成的密钥对
使用这个流程生成密钥对,包括自签名证书。
流程
- 在管理控制台中选择域。
- 点菜单中的 Realm settings。
- 点 Keys 选项卡。
- 点 Providers 选项卡。
- 单击 Add provider,再选择 rsa 生成的。
- 在 Priority 字段中输入数字。此数字决定了新密钥对是否成为活动密钥对。最高数字使密钥对处于活动状态。
- 为 AES Key size 选择一个值。
- 点击 Save。
更改供应商的优先级不会导致密钥被重新生成,但如果您想要更改密钥大小,则可以编辑提供程序,并将生成新密钥。
3.9.3. 通过提取证书来轮转密钥
您可以通过从 RSA 生成的密钥对中提取证书并在新密钥存储中使用该证书来轮转密钥。
先决条件
- 生成的密钥对
流程
- 在管理控制台中选择域。
- 单击 Realm Settings。
点 Keys 选项卡。
此时会出现 Active 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 格式。
流程
- 在管理控制台中选择域。
- 单击 Realm settings。
- 点 Keys 选项卡。
- 点 Providers 选项卡。
- 单击 Add provider,再选择 rsa。
- 在 Priority 字段中输入数字。此数字决定了新密钥对是否成为活动密钥对。
- 点 Private RSA Key 旁边的 Browse… 来上传私钥文件。
- 如果您的私钥有一个签名证书,请点击 Browse… 旁边的 X509 Certificate 来上传证书文件。如果没有上传证书,Red Hat build of Keycloak 会自动生成一个自签名证书。
- 点击 Save。
3.9.5. 从 Java Keystore 中载入密钥
要添加存储在主机上的 Java 密钥存储文件中的密钥对和证书,请选择 Providers
,然后从下拉菜单中选择 java-keystore
。您可以更改优先级,以确保新密钥对成为活跃的密钥对。
要加载关联的证书链,必须将其导入到 Java 密钥存储文件中,并使用 相同的键
别名来加载密钥对。
流程
- 在管理控制台中选择域。
- 点菜单中的 Realm settings。
- 点 Keys 选项卡。
- 点 Providers 选项卡。
- 单击 Add provider,再选择 java-keystore。
- 在 Priority 字段中输入数字。此数字决定了新密钥对是否成为活动密钥对。
- 为 Keystore 输入一个值。
- 输入 Keystore Password 的值。
- 输入 Key Alias 的值。
- 输入 Key Password 的值。
- 点 Save。
3.9.6. 使密钥被动
流程
- 在管理控制台中选择域。
- 点菜单中的 Realm settings。
- 点 Keys 选项卡。
- 点 Providers 选项卡。
- 单击您要进行被动的密钥的供应商。
- 将 Active 切换到 Off。
- 点击 Save。
3.9.7. 禁用密钥
流程
- 在管理控制台中选择域。
- 点菜单中的 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 能够向推送的 not-before 策略请求发送客户端。