2.5. 使用证书系统进行智能卡令牌管理


智能卡 是一个包含加密证书和密钥的硬件加密设备。用户可使用它参与安全网站访问和安全邮件等操作。它还可作为身份验证设备来登录到 Red Hat Enterprise Linux 等各种操作系统。在服务的整个生命周期中,这些卡或令牌的管理由令牌 管理系统 (TMS)完成。

TMS 环境需要证书颁发机构(CA)、令牌密钥服务(TKS)和令牌处理系统(TPS),以及可选的密钥恢复授权(KRA),用于服务器端密钥生成和密钥存档和恢复。在线证书状态协议(OCSP)也可用于与 CA 一起使用,为在线证书状态请求提供服务。本章概述了 TKS 和 TPS 系统,它提供了 Red Hat Certificate System 的智能卡管理功能,以及用户末尾与 TMS 一起工作的企业安全客户端(ESC)。

图 2.4. TMS 如何管理智能卡

tms

2.5.1. 令牌密钥服务(TKS)

令牌密钥服务(TKS)负责管理一个或多个主密钥。它维护 主密钥,是 TMS 中唯一可访问关键资料的实体。在操作环境中,每个有效的智能卡令牌包含一组对称密钥,这些密钥来自主密钥和对卡的唯一 ID (CUID)。

最初,制造商在每个智能卡上初始化一组默认的(每个制造商主密钥)。部署站点应通过密钥 更改 操作来更改此默认集合,以便在 TKS 上生成新的主密钥。作为 master 密钥的唯一所有者,当给出智能卡的 CUID 时,TKS 能够分离驻留在该特定智能卡上的对称密钥集合,然后允许 TKS 建立基于会话的安全频道,以便在 TMS 和每个智能卡之间进行安全通信。

注意

由于 TKS 管理的数据敏感度,应在具有受限访问权限的防火墙后设置 TKS。

2.5.1.1. 主键和密钥集

TKS 支持多个智能卡密钥集。每个智能卡厂商为其智能卡令牌库存创建不同的默认(开发人员)静态密钥集,而 TKS 则配备了静态密钥集(每个制造商)来 kickstart 空白令牌的格式过程。

在空白智能卡令牌的格式过程中,Java 小程序和唯一派生的对称密钥集将注入到令牌中。每个主密钥(在某些情况下被称为 keySet)在 TKS 配置文件(CS.cfg)中包含一组条目。每个 TPS 配置集都包含一个配置,用于将其注册到匹配密钥派生过程的适当 TKS keySet,这基本上负责在 TMS 和智能卡令牌之间建立由一组特定于会话的密钥保护的安全频道。

在 TKS 上,主密钥通过命名 keySets 来定义,供 TPS 引用。在 TPS 上,根据注册类型(内部或外部注册)在 TPS 配置集中指定,或者由 keySet Mapping Resolver 决定。

2.5.1.2. key ceremony (共享密钥传输)

Key Ceremony 是以安全的方式传输高度敏感密钥的过程。在一个情况下,在一个高度安全的部署环境中,可以在没有网络到外部的安全库中生成主密钥。或者,组织可能希望在不同的物理机器上具有 TKS 和 TPS 实例。在这两种情况下,假设没有单个人使用密钥信任,Red Hat Certificate System TMS 都提供了一个称为 tkstool 的工具来管理安全密钥传输。

2.5.1.3. 密钥更新(密钥更改)

当在工厂上创建 Global Platform 兼容智能卡时,制造商会将一组默认对称密钥刻录到令牌中。TKS 最初配置为使用这些对称密钥(TKS 配置中的每个厂商一个 KeySet 条目)。但是,由于这些对称密钥不是同一股票的智能卡,并且由于这些都是知名的密钥,因此强烈建议将这些对称密钥替换为每个令牌的唯一集合,而不是制造商共享,以限制一组可以操作令牌的实体。

通过令牌密钥 Service 子系统帮助更改密钥。TKS 的一个功能是查看之前讨论的智能卡令牌密钥派生的主密钥。可以在 TKS 控制下有多个主键。

重要

当在令牌上进行这个密钥更改过程时,令牌可能会在以后无法使用,因为它不再启用默认密钥。只要置备令牌有效的 TPS 和 TKS 系统,密钥基本上就好。因此,务必要保留所有主密钥,即使其中任何一个密钥都已过时。

您可以禁用 TKS 中的旧主密钥以更好地控制,但除非禁用的令牌是您的计划的一部分,否则请不要删除它们。支持将令牌密钥还原回原始密钥集,如果令牌要在某种测试方案中再次重复使用,则这是可行的。

2.5.1.4. APDU 和安全频道

Red Hat Certificate System Token Management System (TMS)支持 GlobalPlatform 智能卡规格,其中安全频道实现由令牌密钥系统(TKS)管理主密钥和令牌处理系统(TPS)与智能卡(令牌)与应用程序 协议数据单元(A PDU)通信。

APDU 有两种类型:

  • 命令 A PDU,由 TPS 发送到智能卡
  • 响应 A PDU,由智能卡发送到 TPS,作为命令 APDU 的响应

当客户端采取行动并连接到证书系统服务器以进行请求时,可能会触发 APDU 命令的启动。安全通道从从 TPS 发送到智能卡令牌的 InitializeUpdate APDU 开头,并与 ExternalAuthenticate APDU 完全建立。然后,令牌和 TMS 都建立了一组共享 secret,称为会话密钥,用于加密和验证通信。这个经过验证和加密的通信通道被称为 Secure Channel。

因为 TKS 是唯一可以访问主密钥的实体,它能够生成一组唯一的对称 on-token 智能卡密钥,因此 Secure Channel 提供了 TMS 和每个令牌之间的足够保护通信。任何与频道断开连接都需要为新频道重新建立新会话密钥。

2.5.2. 令牌处理系统(TPS)

令牌处理系统(TPS)是智能卡证书注册的注册机构。它充当用户中心化企业安全客户端(ESC)之间的代表,它与客户端侧智能卡令牌交互,以及证书系统后端子系统,如证书颁发机构(CA)和密钥恢复授权(KRA)。

在 TMS 中,需要 TPS 来管理智能卡,因为它是唯一了解 APDU 命令和响应的 TMS 实体。TPS 将命令发送到智能卡,以帮助它们为特定实体(如用户或设备)生成和存储密钥和证书。智能卡操作经过 TPS,并转发到相应的子系统,如 CA 来生成证书或 KRA 来生成、存档或恢复密钥。

2.5.2.1. CoolKey 小程序

Red Hat Certificate System 包含 Coolkey Java 小程序,专门用于在 TMS 支持的智能卡令牌上运行。Coolkey 小程序连接到处理证书和密钥相关操作的 PKCSxdg 模块。在令牌格式操作过程中,这个小程序使用 Secure Channel 协议注入到智能卡令牌中,并可为每个配置进行更新。

2.5.2.2. 令牌操作

Red Hat Certificate System 中的 TPS 可用于代表智能卡最终用户置备智能卡。令牌处理系统提供对以下主要令牌操作的支持:

  • Token Format - 格式操作负责将正确的 Coolkey 小程序安装到令牌中。小程序提供了一个平台,稍后可以放置后续的加密密钥和证书。
  • Token Enrollment - 注册操作会导致智能卡填充所需的加密密钥和加密证书。本材料允许智能卡的用户参与诸如安全网站访问和安全邮件等操作。支持两种类型的注册,这些注册在全局配置:

    • 由 TPS 配置集确定 的内部 注册服务注册由配置集 映射解析器 决定。
    • 由 TPS 配置集由用户的 LDAP 记录中的条目决定 的外部 注册注册。
  • 令牌 PIN 重置 - 令牌 PIN 重置操作允许令牌的用户指定用于登录到令牌的新 PIN,使其可用于执行加密操作。

以下其他操作可以被视为上面所列主要操作的补充或固有的操作。它们可以根据相关配置或令牌状态触发。

  • Key Generation - 每个 PKI 证书由一个公钥/私钥对组成。在 Red Hat Certificate System 中,可以通过两种方式完成密钥生成,具体取决于 TPS 配置集配置

    • Token Side Key Generation - PKI 密钥对在智能卡令牌上生成。在令牌端生成密钥对 不允许 进行密钥归档。
    • Server Side Key Generation - PKI 密钥对在 TMS 服务器端生成。然后,密钥对会使用 Secure Channel 发回到令牌。在服务器端生成密钥对允许密钥归档。
  • 证书续订 - 此操作允许之前注册的令牌在重新使用同一密钥时在令牌上重新发布证书。当旧证书到期并且您希望创建新证书但维护原始密钥材料时,这非常有用。
  • 证书撤销- 可以根据 TPS 配置集配置或根据令牌状态触发证书撤销。

    通常,只有发布的证书的 CA 可以撤销证书,这可能意味着重新创建 CA 无法撤销某些证书。但是,可以在将令牌的撤销请求路由到已停用的 CA 时,仍然会将所有其他请求路由,如注册至新的活动 CA。这种机制称为撤销 路由

  • Token Key Changeover - 由格式操作触发的密钥更改操作,从而可以将令牌的内部密钥从默认开发人员密钥集改为由 Token Processing System 部署控制的新密钥集。这通常在任何实际的部署场景中完成,因为开发人员密钥集更适合测试情况。
  • 小程序更新 - 在 TMS 部署过程中,如果需要,可以更新或降级 Coolkey 智能卡小程序。

2.5.2.3. TPS 配置集

证书系统令牌处理系统子系统有助于管理智能卡令牌。令牌由 TPS 置备,以便它们从空状态转换为格式或注册条件。格式化令牌是包含 TPS 支持的 CoolKey 小程序的令牌,而注册的令牌则被个人化为具有必要证书和加密密钥的个人。 这个完全置备的令牌可用于 crytptographic 操作。

TPS 也可以管理配置文件 。令牌配置文件的概念与以下内容相关:

  • 格式化或注册令牌的步骤。
  • 在操作成功完成后,已完成的令牌中包含的属性。

以下列表包含组成唯一令牌配置集的一些数量:

  • TPS 如何连接到用户的身份验证 LDAP 数据库?
  • 此令牌操作是否需要用户身份验证?如果是,将使用什么身份验证管理器?
  • TPS 如何连接到要获取证书的证书系统 CA?
  • 如何在此令牌中生成私钥和公钥?它们是否在令牌端或服务器端生成?
  • 生成私钥和公钥时要使用的密钥大小(以位为单位)?
  • 哪个证书注册配置文件(由 CA 置备)用于在这个令牌上生成证书?

    注意

    此设置将决定要写入令牌的证书的最终结构。根据证书中包含的扩展,可以为不同的使用创建不同的证书。例如,一个证书可以特殊化数据加密,另一个证书可用于签名操作。

  • 令牌上需要哪个 Coolkey 小程序版本?
  • 在此令牌中,将放置多少个证书用于注册操作?

以上以及许多其他令牌类型或配置集可以为每个令牌类型或配置集进行配置。有关可用配置选项的完整列表,请参见 Red Hat Certificate System 管理指南

要考虑的另一个问题是用户置备给定令牌的方式将被映射到单个令牌配置文件。注册有两种类型:

  • 内部注册 - 在这种情况下,TPS 配置集(tokenType)由配置集 Mapping Resolver 决定。这个基于过滤器的解析器可以配置为考虑令牌提供的任何数据,并确定目标配置集。
  • 外部注册 - 使用外部注册时,配置文件(仅在名称中 - 仍在 TPS 中以与内部注册使用的相同)定义,在每个用户的 LDAP 记录中指定,该配置文件在身份验证期间获得。这允许 TPS 从存储用户信息的外部注册目录服务器获取密钥注册和恢复信息。这可让您控制覆盖 TPS 内部注册机制固有的注册、撤销和恢复策略。与外部注册相关的用户 LDAP 记录属性名称可以配置。

    当需要"组证书"的概念时,外部注册非常有用。在这种情况下,组中的所有用户都可以在其 LDAP 配置文件中配置特殊的记录来下载共享证书和密钥。

要使用的注册会根据 TPS 实例全局配置。

2.5.2.4. 令牌数据库

令牌处理系统利用 LDAP 令牌数据库存储,用于存储保留活动令牌及其对应证书的列表,并跟踪每个令牌的当前状态。新令牌被视为 未初始化,而完全注册的令牌则被视为注册。 此数据存储会持续更新,并在处理令牌时被 TPS 查询。

2.5.2.4.1. 令牌状态和转换

令牌处理系统将状态存储在其内部数据库中,以确定当前的令牌状态以及可以在令牌上执行的操作。

2.5.2.4.1.1. 令牌状态

下表列出了所有可能的令牌状态:

表 2.9. 可能的令牌状态
Name代码标签

格式化

0

格式化(未初始化)

DAMAGED

1

物理损坏的

PERM_LOST

2

永久丢失

暂停

3

暂停(临时丢失)

ACTIVE

4

Active

已终止

6

已终止

未格式化的

7

未格式化的

命令行界面使用上面列出的 Name 显示令牌状态。图形界面改为使用 Label。

注意

以上表不包含带有代码 5 的状态,之前属于已删除的状态。

2.5.2.4.1.2. 使用图形或命令行界面进行令牌状态转换

每个令牌状态的下一个状态有限,它可能会过渡到。例如,令牌可以将状态从 FORMATTED 更改为 ACTIVEDAMAGED,但它不能从 FORMATTED 转变为 UNFORMATTED

另外,根据使用命令行或图形界面手动触发转换,或自动使用令牌操作,令牌可以过渡到的状态列表会有所不同。允许手动转换的列表存储在 tokendb.allowedTransitions 属性中,tps.operations.allowedTransitions 属性控制允许由令牌操作触发的转换。

手动和基于令牌操作的转换的默认配置都存储在 /usr/share/pki/tps/conf/CS.cfg 配置文件中。

2.5.2.4.1.2.1. 使用命令行或图形界面转换令牌状态

使用 tokendb.allowedTransitions 属性描述了命令行或图形界面中允许的所有可能转换:

tokendb.allowedTransitions=0:1,0:2,0:3,0:6,3:2,3:6,4:1,4:2,4:3,4:6,6:7

属性包含以逗号分隔的转换列表。每个转换都是以 < current code>:[rep] <new code& gt; 的格式编写的。代码在 表 2.10 “可能的手动令牌状态转换” 中进行了描述。默认配置保留在 /usr/share/pki/tps/conf/CS.cfg 中。

下表描述了每个可能的转换信息:

表 2.10. 可能的手动令牌状态转换
转换当前状态下一个状态描述

0:1

格式化

DAMAGED

这个令牌已被物理损坏。

0:2

格式化

PERM_LOST

这个令牌已被永久丢失。

0:3

格式化

暂停

这个令牌已被暂停(临时丢失)。

0:6

格式化

已终止

此令牌已被终止。

3:2

暂停

PERM_LOST

这个暂停的令牌已永久丢失。

3:6

暂停

已终止

这个暂停的令牌已被终止。

4:1

ACTIVE

DAMAGED

这个令牌已被物理损坏。

4:2

ACTIVE

PERM_LOST

这个令牌已被永久丢失。

4:3

ACTIVE

暂停

这个令牌已被暂停(临时丢失)。

4:6

ACTIVE

已终止

此令牌已被终止。

6:7

已终止

未格式化的

重复使用此令牌。

以下转换会根据令牌的原始状态自动生成。如果令牌最初为 FORMATTED,然后成为 SUSPENDED,则只能返回到 FORMATTED 状态。如果令牌最初为 ACTIVE,然后变为 SUSPENDED,它只能返回到 ACTIVE 状态。

表 2.11. 令牌状态转换自动触发
转换当前状态下一个状态描述

3:0

暂停

格式化

找到这个暂停(临时丢失)令牌。

3:4

暂停

ACTIVE

找到这个暂停(临时丢失)令牌。

2.5.2.4.1.3. 使用令牌操作进行令牌状态转换

TPS 配置文件使用 tokendb.allowedTransitions 属性描述了所有可以使用令牌操作完成的可能转换:

tps.operations.allowedTransitions=0:0,0:4,4:4,4:0,7:0

属性包含以逗号分隔的转换列表。每个转换都是以 < current code>:[rep] <new code& gt; 的格式编写的。代码在 表 2.10 “可能的手动令牌状态转换” 中进行了描述。默认配置保留在 /usr/share/pki/tps/conf/CS.cfg 中。

下表描述了每个可能的转换信息:

表 2.12. 使用令牌操作进行可能的令牌状态转换
转换当前状态下一个状态描述

0:0

格式化

格式化

这允许重新格式化令牌或升级令牌中的小程序/密钥。

0:4

格式化

ACTIVE

这允许注册令牌。

4:4

ACTIVE

ACTIVE

这允许重新注册一个活跃的令牌。可能对外部注册很有用。

4:0

ACTIVE

格式化

这允许格式化活跃的令牌。

7:0

未格式化的

格式化

这允许格式化空白或之前使用的令牌。

2.5.2.4.1.4. 令牌状态和转换标签

令牌状态和转换的默认标签存储在 /usr/share/pki/tps/conf/token-states.properties 配置文件中。默认情况下,该文件包含以下内容:

# Token states
UNFORMATTED         = Unformatted
FORMATTED           = Formatted (uninitialized)
ACTIVE              = Active
SUSPENDED           = Suspended (temporarily lost)
PERM_LOST           = Permanently lost
DAMAGED             = Physically damaged
TEMP_LOST_PERM_LOST = Temporarily lost then permanently lost
TERMINATED          = Terminated

# Token state transitions
FORMATTED.DAMAGED        = This token has been physically damaged.
FORMATTED.PERM_LOST      = This token has been permanently lost.
FORMATTED.SUSPENDED      = This token has been suspended (temporarily lost).
FORMATTED.TERMINATED     = This token has been terminated.
SUSPENDED.ACTIVE         = This suspended (temporarily lost) token has been found.
SUSPENDED.PERM_LOST      = This suspended (temporarily lost) token has become permanently lost.
SUSPENDED.TERMINATED     = This suspended (temporarily lost) token has been terminated.
SUSPENDED.FORMATTED      = This suspended (temporarily lost) token has been found.
ACTIVE.DAMAGED           = This token has been physically damaged.
ACTIVE.PERM_LOST         = This token has been permanently lost.
ACTIVE.SUSPENDED         = This token has been suspended (temporarily lost).
ACTIVE.TERMINATED        = This token has been terminated.
TERMINATED.UNFORMATTED   = Reuse this token.
2.5.2.4.1.5. 自定义允许的令牌状态转换

要自定义令牌状态转换列表,请编辑 /var/lib/pki/ instance_name/tps/conf/CS.cfg 中的以下属性:

  • tokendb.allowedTransitions,使用命令行或图形界面自定义允许转换的列表
  • TPS.operations.allowedTransitions,使用令牌操作自定义允许转换列表

如果需要,可以从默认列表中删除转换,但无法添加新转换,除非它们位于默认列表中。默认值存储在 /usr/share/pki/tps/conf/CS.cfg 中。

2.5.2.4.1.6. 自定义令牌状态和转换标签

要自定义令牌状态并转换标签,请将默认的 /usr/share/pki/tps/conf/token-states.properties 复制到您的实例文件夹(/var/lib/pki/ instance_name/tps/conf/CS.cfg),并根据需要更改列出的标签。

更改将立即生效,不需要重新启动服务器。TPS 用户界面可能需要重新加载。

要恢复到默认状态和标签名称,请从实例文件夹中删除编辑的 token-states.properties 文件。

2.5.2.4.1.7. 令牌活动日志

某些 TPS 活动记录在日志中。下表中列出了日志文件中可能的事件。

表 2.13. TPS 活动日志事件
活动描述

add

添加了令牌。

格式

令牌已被格式化。

注册

令牌已注册。

recovery

令牌已被恢复。

续订

令牌已续订。

pin_reset

令牌 PIN 被重置。

token_status_change

使用命令行或图形界面更改令牌状态。

token_modify

修改了令牌。

delete

令牌已删除。

cert_revocation

令牌证书已被撤销。

cert_unrevocation

令牌证书被取消撤销。

2.5.2.4.2. 令牌策略

如果进行内部注册,每个令牌都可以由一组令牌策略进行管理。默认策略为:

RE_ENROLL=YES;RENEW=NO;FORCE_FORMAT=NO;PIN_RESET=NO;RESET_PIN_RESET_TO_NO=NO;RENEW_KEEP_OLD_ENC_CERTS=YES

内部注册下的所有 TPS 操作都受到令牌记录中指定的策略。如果没有为令牌指定策略,TPS 将使用默认的策略集合。

2.5.2.5. 映射解析器

Mapping Resolver 是 TPS 使用的可扩展机制,用于根据可配置的标准决定哪些令牌配置文件分配给特定令牌。每个映射解析器实例可以在配置中唯一定义,每个操作都可以指向各种定义的映射解析器实例。

注意

映射解析器框架提供了一个用于编写自定义插件的平台。但是,有关如何编写插件的说明超出了本文档的范围。

FilterMappingResolver 是默认情况下,由 TPS 提供的唯一映射解析器实现。它允许您为每个 映射 定义一组映射和目标结果。每个映射都包含一组过滤器,其中:

  • 如果输入过滤器参数传递映射 中的所有 过滤器,则会分配 target 值。
  • 如果输入参数失败,则会跳过该映射,并按顺序尝试下一个映射。
  • 如果过滤器没有指定的值,它将始终通过。
  • 如果过滤器具有指定的值,则输入参数必须完全匹配。
  • 定义映射的顺序非常重要。传递的第一个映射被视为已解析,并返回到调用者。

输入过滤器参数是从带有或没有扩展的智能卡令牌接收的信息。它们会根据上述规则针对 FilterMappingResolver 运行。FilterMappingResolver 支持以下输入过滤器参数:

  • appletMajorVersion - 令牌上 Coolkey 小程序的主要版本。
  • appletMinorVersion - 令牌上 Coolkey 小程序的次要版本。
  • keySettokenType

    • keySet - 可以在客户端请求中设置为扩展。如果指定了扩展,必须与过滤器中的值匹配。keySet 映射解析器用于在使用外部注册时确定 keySet 值。当支持多个密钥集(例如,不同的智能卡令牌供应商)时,外部注册环境中需要 Key Set Mapping Resolver。在 TKS 中标识 master 密钥需要 keySet 值,这对于建立安全频道至关重要。当用户的 LDAP 记录填充了 set tokenType (TPS 配置集)时,它不知道哪个卡最终进行注册,因此 keySet 无法预先确定。keySetMappingResolver 允许在身份验证前解决 keySet 来帮助解决这个问题。
    • tokenType - okenType 可以在客户端请求中设置为扩展。如果指定扩展,则必须匹配过滤器中的值。当前为内部注册环境确定了 tokenType (也称为 TPS Profile)。
  • tokenATR - 令牌回答重置(ATR)。
  • tokenCUID - "start" 和 "end" 定义令牌的 Card Unique ID (CUID)的范围,才能传递此过滤器。

2.5.2.6. TPS 角色

TPS 默认支持以下角色:

  • TPS Administrator - 此角色允许:

    • 管理 TPS 令牌
    • 查看 TPS 证书和活动
    • 管理 TPS 用户和组
    • 更改常规 TPS 配置
    • 管理 TPS 验证器和连接器
    • 配置 TPS 配置集和配置集映射
    • 配置 TPS 审计日志记录
  • TPS Agent - 此角色允许:

    • 配置 TPS 令牌
    • 查看 TPS 证书和活动
    • 更改 TPS 配置集的状态
  • TPS Operator - 允许此角色:

    • 查看 TPS 令牌、证书和活动

2.5.3. TKS/TPS 共享 secret

在 TMS 安装过程中,在令牌密钥服务和令牌处理系统之间建立了一个共享对称密钥。这个键的目的是嵌套和解封会话密钥,这些密钥对于安全频道至关重要。

注意

共享密钥目前仅保存在软件加密数据库中。计划在以后的 Red Hat Certificate System 发行版本中,支持将该密钥保留在硬件安全模块(HSM)设备上。实现这个功能后,您将指示使用 tkstool 将密钥传送到 HSM 来运行 Key Ceremony。

2.5.4. 企业安全客户端(ESC)

企业安全客户端 是一个 HTTP 客户端应用程序,类似于 Web 浏览器,它与 TPS 通信并处理客户端中的智能卡令牌。在 ESC 和 TPS 之间建立 HTTPS 连接,但在每个 TLS 会话中的令牌和 TMS 之间也会建立一个底层的安全频道。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.