Skip to main content

关于 SSH 证书颁发机构

借助 SSH 证书颁发机构,组织或企业帐户可以提供 SSH 证书,以供成员以及外部协作者通过 Git 访问你的资源。

关于 SSH 证书颁发机构

SSH 证书是一种允许一个 SSH 密钥对另一个 SSH 密钥进行签名的机制。 如果使用 SSH 证书颁发机构 (CA) 为组织成员和外部协作者提供已签名的 SSH 证书,则可以将 CA 添加到企业帐户或组织,以便这些组织参与者使用其证书访问组织资源。

          GitHub 使用 OpenSSH 格式的 SSH 用户证书,通过验证证书的签名和字段(包括有效期)来对通过 SSH 的 Git 操作进行身份验证,这些证书的签名和字段会与在组织和/或企业级别配置的受信任 SSH 证书颁发机构(CA)进行核对。

注意

若要使用 SSH 证书颁发机构,组织必须使用 GitHub Enterprise Cloud。 有关如何免费试用 GitHub Enterprise Cloud 的详细信息,请参阅“设置试用版 GitHub Enterprise Cloud”。

在将 SSH CA 添加到组织或企业帐户后,则可以使用 CA 为组织成员和外部协作者签署客户端 SSH 证书。 这些组织参与者可以使用已签名的证书来访问组织的存储库。

添加到您企业帐户中的证书可授予对该帐户下所有组织的访问权限。 有关详细信息,请参阅“在企业中强制执行安全设置策略”。

可以要求成员使用 SSH 证书访问组织资源。

(可选)你可以要求成员和外部协作者使用 SSH 证书访问组织资源。 有关详细信息,请参阅 管理组织的 SSH 认证中心在企业中强制执行安全设置策略

例如,您可以构建内部系统,每天早上向开发者颁发新证书。 每个开发人员都可以使用其日常证书来处理你组织在 GitHub 上的存储库。 在一天结束时,证书会自动到期,以保护仓库,避免证书以后被窃取。

即使已强制实施 SAML 单一登录(SSO),组织参与者也可以使用其签名证书进行身份验证,而无需授权签名的证书。

除非你要求使用 SSH 证书,否则组织成员和外部协作者可以继续使用其他身份验证方式通过 Git 访问组织的资源,包括其用户名和密码, personal access token以及自己的 SSH 密钥。

除非企业允许 SSH CA 访问用户拥有的存储库,否则成员将无法使用证书访问组织存储库的分支。 有关详细信息,请参阅“关于 SSH 证书颁发机构”。

关于具有 SSH 证书的 SSH URL

如果组织要求必须使用 SSH 证书,为防止身份验证错误,组织成员和外部协作者在通过 SSH 执行 Git 操作时应使用包含组织 ID 的特殊 URL。 此特殊 URL 允许客户端和服务器更轻松地协商应使用成员计算机上的哪个密钥进行身份验证。 如果成员使用以 git@github.com 开头的正常 URL,则 SSH 客户端可能会提供错误的密钥,从而导致操作失败。

对存储库具有读取访问权限的任何人都可以通过以下方式找到此 URL:选择存储库主页上的“代码”下拉菜单,然后单击“使用 SSH” 。

如果组织未要求必须使用 SSH 证书,则参与者可以继续使用自己的 SSH 密钥或其他身份验证方式。 在这种情况下,特殊 URL 或以 git@github.com 开头的正常 URL 将起作用。

颁发证书

颁发每个证书时,必须包含一个扩展,用于指定 GitHub 用户是该证书所属的对象。 可以使用其登录句柄 或其用户 ID 来引用用户。 例如,可以使用 OpenSSH 的 ssh-keygen 命令,将 KEY-IDENTITY 替换为密钥标识,将 USERNAME 替换为 GitHub 用户名 或用户 ID。 您生成的证书将授权代表该用户使用您组织的任何资源。 在签发证书之前,请确保验证用户的身份。

注意

必须更新到 OpenSSH 7.6 或更高版本才能使用这些命令。

要使用 login 标识用户,请使用 extension:login

ssh-keygen -s ./ca-key -V '+1d' -I KEY-IDENTITY -O extension:login@github.com=USERNAME ./user-key.pub

若要使用用户 ID,请使用 extension:id

ssh-keygen -s ./ca-key -V '+1d' -I KEY-IDENTITY -O extension:id@github.com=ID ./user-key.pub

警告

证书签名并颁发后,无法吊销。

对于在2024 年 3 月 27 日之后的 CA,必须使用-V该标志来配置证书的有效期,使其少于 366 天。 对于在此日期之前上传的 CA,-V 标志是可选的,你可以创建不可撤销且永不过期的证书。

如果旧 CA 免除了过期要求,则可以升级 CA 以强制实施该要求。 若要了解详细信息,请参阅“管理组织的 SSH 认证中心”和“在企业中强制执行安全设置策略”。

如果你使用用户名作为登录扩展,GitHub 会验证该指定用户自证书颁发以来是否未被重命名。 这样可以防止重命名攻击,即使基础用户帐户发生更改,为用户名发布的证书也是有效的。 要强制实施此要求,证书必须包含 valid_after 声明,该声明告诉我们证书是何时发布的。 如果证书不需要过期,则通常缺少此字段,这就是现在需要过期的原因。

若要为使用 SSH 访问多个 GitHub 产品的某人颁发证书,可以包括两个登录扩展来指定每个产品的用户名。 例如,以下命令将为 GitHub Enterprise Cloud 上的用户帐户颁发 USERNAME-1 的证书,并在 HOSTNAME 上为 GitHub Enterprise Server 或 带有数据驻留权的 GitHub Enterprise Cloud 上的用户帐户颁发 USERNAME-2 的证书。

ssh-keygen -s ./ca-key -V '+1d' -I KEY-IDENTITY -O extension:login@github.com=USERNAME-1 extension:login@HOSTNAME=USERNAME-2 ./user-key.pub

可以使用 source-address 扩展来限制组织成员用来访问组织资源的 IP 地址。 扩展接受采用 CIDR 表示法的特定 IP 地址或一个 IP 地址范围。 您可以指定多个地址或范围,用逗号分隔值。 有关详细信息,请参阅 Wikipedia 上的无类别域际路由

ssh-keygen -s ./ca-key -V '+1d' -I KEY-IDENTITY -O extension:login@github.com=USERNAME -O source-address=COMMA-SEPARATED-LIST-OF-IP-ADDRESSES-OR-RANGES ./user-key.pub

证书吊销和 CA 轮换

          GitHub 根据签名、字段(包括其有效期)以及签名 CA 在组织或企业级别是否受信任来验证 SSH 证书。 OpenSSH 证书不使用证书吊销列表(CRL)或联机证书状态协议(OCSP),因此无法撤销个人已颁发的证书,同时继续信任同一 CA。

若要在证书自然过期之前使证书失效,请从组织或企业设置中删除颁发 CA。 删除 CA 会立即阻止 GitHub 接受该 CA 签名的任何 SSH 证书。

警告

从组织或企业设置中删除 CA 会使已签名的所有证书失效,包括尚未过期的证书。

若要在尽量减少中断情况下轮换 CA,请执行:

  1. 将新 CA 添加到企业或组织设置。
  2. 更新证书颁发系统,使用新的 CA 对新证书进行签名。
  3. 所有用户从新 CA 收到新证书后,请删除旧的 CA。

一旦证书被破解,颁发短期证书可以减少风险窗口。 有关管理 CA 的详细信息,请参阅 管理组织的 SSH 认证中心在企业中强制执行安全设置策略