关于 SSH 认证中心
SSH 证书是一种机制:一个 SSH 密钥对另一个 SSH 密钥签名。 如果使用 SSH 证书颁发机构 (CA) 为组织成员和外部协作者提供已签名的 SSH 证书,则可以将 CA 添加到企业帐户或组织,以便这些组织参与者使用其证书访问组织资源。
在将 SSH CA 添加到组织或企业帐户后,则可以使用 CA 为组织成员和外部协作者签署客户端 SSH 证书。 这些组织参与者可以使用已签名的证书来访问组织的存储库。
添加到企业的证书可授予对企业帐户拥有的所有组织的访问权限。 有关详细信息,请参阅“为企业中的安全设置实施策略”。
您可以要求成员使用 SSH 证书访问组织资源,除非 SSH 已在仓库中禁用。
(可选)你可以要求成员和外部协作者使用 SSH 证书访问组织资源。 有关详细信息,请参阅“管理组织的 SSH 认证中心”和“为企业中的安全设置实施策略”。
例如,您可以构建内部系统,每天早上向开发者颁发新证书。 每个开发者可以使用其每日证书处理组织在 GitHub Enterprise Server 上的仓库。 在一天结束时,证书会自动到期,以保护仓库,避免证书以后被窃取。
除非企业允许 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 Enterprise Server 用户。 你可以使用用户的登录句柄 引用用户。 例如,你可以使用 OpenSSH 的 ssh-keygen
命令,将 KEY-IDENTITY 替换为密钥标识,USERNAME 替换为 GitHub Enterprise Server 用户名。 您生成的证书将授权代表该用户使用您组织的任何资源。 在签发证书之前,请确保验证用户的身份。
Note
必须更新到 OpenSSH 7.6 或更高版本才能使用这些命令。
要使用 login
标识用户,请使用 extension:login
:
ssh-keygen -s ./ca-key -V '+1d' -I KEY-IDENTITY -O extension:login@HOSTNAME=USERNAME ./user-key.pub
Warning
证书签名并颁发后,无法吊销。
对于上传到GitHub Enterprise Server版本 3.13 或更高版本的 CA,你将需要 使用 -V
标志为证书配置少于 366 天的生存期。 对于上传的 3.13 版本之前 的 CA,-V
标志是可选的,你可以创建不可撤销且永久有效的证书。
要为使用 SSH 访问多个 GitHub 产品的人颁发证书,您可以包括两个登录扩展,以指定每个产品的用户名。 例如,以下命令将为 GitHub Enterprise Cloud 的用户帐户颁发 USERNAME-1 的证书,为 HOSTNAME 处的 GitHub Enterprise Server 上的用户帐户颁发 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@HOSTNAME=USERNAME -O source-address=COMMA-SEPARATED-LIST-OF-IP-ADDRESSES-OR-RANGES ./user-key.pub