ChatGPT解决这个技术问题 Extra ChatGPT

为什么 GitHub 推荐 HTTPS 而不是 SSH?

在 GitHub 网站上有一个链接...

https://help.github.com/articles/generating-ssh-keys

...它说...

如果您决定不使用推荐的 HTTPS 方法,我们可以使用 SSH 密钥在您的计算机和 GitHub 之间建立安全连接。以下步骤将引导您生成 SSH 密钥,然后将公钥添加到您的 GitHub 帐户。

为什么 HTTPS 是推荐的方法? SSH 方法中是否存在某种安全漏洞,还是速度较慢?我创建了一个 SSH 密钥,这样可以缓解任何安全问题吗?

更少的配置意味着更容易,也许。此外,一些劣质操作系统甚至没有默认安装 SSH 客户端。
对于发现此线程的未来用户:GitHub 已更改其政策,现在说“我们强烈建议在与 GitHub 交互时使用 SSH 连接。”
@StevePomeroy,我认为该位置不存在“强烈推荐”声明。
@BonsaiOak 它曾经在Steve Pomeroy 链接到的页面上 - web.archive.org/web/20140321204642/https://help.github.com/… - 但看起来他们从那时起改变了它。
@br3nt 对。他们过去不推荐它。然后他们做到了。然后他们又没有了。这就是为什么我的链接是指向 archive.org 页面的原因

b
bleuthoot

GitHub 已多次更改他们的建议 (example)。

看来他们目前推荐 HTTPS,因为它是最容易在最广泛的网络和平台上设置的,而且对于所有这一切的新手来说都是最容易的。

SSH 没有固有缺陷(如果有的话,他们会禁用它)——在下面的链接中,您会看到它们仍然提供有关 SSH 连接的详细信息:

HTTPS 不太可能被防火墙阻止。 https://docs.github.com/en/get-started/getting-started-with-git/about-remote-repositories#cloning-with-https-urls https:// 克隆 URL 可用于所有存储库,不管能见度如何。即使您位于防火墙或代理之后,https:// 克隆 URL 也能正常工作。 HTTPS 连接允许 credential.helper 缓存您的密码。 https://docs.github.com/en/get-started/quickstart/set-up-git#connecting-over-https-recommended 如果您使用 HTTPS 进行克隆,您可以使用凭证助手在 Git 中缓存您的 GitHub 凭证。有关更多信息,请参阅“使用 HTTPS url 进行克隆”和“在 Git 中缓存您的 GitHub 凭据”。


啊,所以他们只是推荐 HTTPS,这样他们就不必记录 ssh-agent?很公平。谢谢!
@sarnold 这可能与与 ssh-agent 和公钥管理相关的问题数量以及允许出站 HTTP/HTTPS 但不允许 SSH 的企业防火墙数量有关。
我认为 https 使人们更容易上手,因为您不必执行整个生成/复制/粘贴 ssh 密钥业务。从 Github 的角度来看,它也可以被视为更安全,因为获得您的 ssh 密码(或发现您打开的计算机终端)的攻击者仍然需要知道您的 Github 密码才能推送任何内容。
@kristi 如果攻击者在密码缓存过期之前找到该终端,即使他不知道密码,他是否仍然能够推送?如果您使用 ssh-agent,问题大致相同,明显的区别是您必须输入 ssh 密钥的密码而不是您的 github 密码(并且似乎没有明显的缓存过期设置)。输入 github 密码而不是 ssh 密钥密码的想法似乎是倒退了一步,尽管是一小步,因为这两个密钥为您提供的功能与 AFAIK 大致相同。
我认为这几乎完全是为了减少他们获得的支持查询量。我想您也可能会争辩说,由于无论如何您都必须通过 HTTPS 输入密码才能访问该网站,因此您无法通过使用不同的身份验证机制(SSH 密钥)来提高安全性,但您可能会增加攻击面可能会降低安全性。尽管如此,如果使用得当,HTTPS 和 SSH 都应该足够安全。
j
jr0cket

我认为 GitHub 推荐 HTTPS 有几个原因

从任何地方访问存储库都更简单,因为您只需要您的帐户详细信息(不需要 SSH 密钥)即可写入存储库。 HTTPS 是在所有防火墙中都开放的端口。 SSH 并不总是作为与外部网络通信的端口打开

因此,使用 HTTPS 比使用 SSH 更普遍地访问 GitHub 存储库。

在我看来,SSH 密钥值得在创建它们时进行一些额外的工作

SSH 密钥不提供对您的 GitHub 帐户的访问权限,因此如果您的密钥被盗,您的帐户不会被劫持。对您的 SSH 密钥使用强大的关键字可以限制任何滥用,即使您的密钥被盗(在首次破坏对您的计算机帐户的访问保护之后)

如果您的 GitHub 帐户凭据(用户名/密码)被盗,可以更改您的 GitHub 密码以阻止您访问,并且可以快速删除您的所有共享存储库。

如果私钥被盗,有人可以强制推送一个空存储库并清除您拥有的每个存储库的所有更改历史记录,但无法更改您的 GitHub 帐户中的任何内容。尝试从您有权访问您的 GitHub 帐户的违规行为中恢复会容易得多。

我的偏好是使用带有密码保护密钥的 SSH。我为每台计算机设置了不同的 SSH 密钥,因此如果该计算机被盗或密钥泄露,我可以快速登录 GitHub 并删除该密钥以防止不必要的访问。

如果您所在的网络阻止了 SSH 端口,则可以通过 HTTPS 建立 SSH 隧道。

https://help.github.com/articles/using-ssh-over-the-https-port/

如果您使用 HTTPS,我建议您添加双重身份验证,以保护您的帐户和存储库。

如果您将 HTTPS 与工具(例如编辑器)一起使用,您应该使用 GitHub 帐户中的开发人员令牌,而不是在该工具配置中缓存用户名和密码。令牌将减轻使用 HTTPS 的一些潜在风险,因为令牌可以配置为非常特定的访问权限,并且如果该令牌被泄露,则很容易被撤销。


“尽管如果有人确实掌握了您的私钥,他们可以强制推送一个空存储库并清除您的更改历史” - 是的(而且会很糟糕),但是分布式代码库的美丽使我们能够与某人一起恢复至少有它的副本。
我不确定是否有人能够强制推送是 SSH 和 HTTPS 之间的区别。如果我有你的用户名和密码,我同样可以强制推送。
如果您有用户名和密码,您可以删除所有内容(当然,在更改密码和电子邮件联系人之后)。如果您可以删除它们,则无需对每个存储库进行单独的强制推送。
您正在比较密码与 ssh 密钥,而 https 连接需要特殊令牌。
HTTPS 不需要开发人员令牌,只需要用户名和密码(如果在 GitHub 帐户上启用,则需要 2FA)。我建议在用户名/密码上使用令牌。开发人员令牌的固有风险较小,因为它可以针对特定访问进行配置,不使用 GitHub 帐户密码,并且在被泄露时可撤销。
S
Sid Sarasvati

要么你引用错误,要么 github 在不同的页面上有不同的建议,或者他们可能会随着时间的推移学习并更新他们的记录。

我们强烈建议在与 GitHub 交互时使用 SSH 连接。 SSH 密钥是一种无需密码即可识别受信任计算机的方法。以下步骤将引导您生成 SSH 密钥,然后将公钥添加到您的 GitHub 帐户。

https://help.github.com/articles/generating-ssh-keys


FWIW,此页面不再包含此答案中引用的“强烈推荐”文本。
以下链接中的 HTTPS 仍然使用“推荐”:help.github.com/articles/which-remote-url-should-i-use/…“使用 HTTPS URL 进行克隆(推荐)”
现在他们完全删除了那句话。
m
mja

如果被防火墙阻止,则通过 HTTPS 启用 SSH 连接

测试是否可以通过 HTTPS 端口进行 SSH,运行以下 SSH 命令:

$ ssh -T -p 443 git@ssh.github.com
Hi username! You've successfully authenticated, but GitHub does not
provide shell access.

如果这有效,那就太好了!如果没有,您可能需要关注我们的troubleshooting guide

如果您能够通过端口 443 SSH 进入 git@ssh.github.com,则可以覆盖 SSH 设置以强制任何与 GitHub 的连接通过该服务器和端口运行。

要在您的 ssh 配置中进行设置,请编辑 ~/.ssh/config 处的文件,并添加此部分:

Host github.com
  Hostname ssh.github.com
  Port 443

您可以通过再次连接到 GitHub 来测试它是否有效:

$ ssh -T git@github.com
Hi username! You've successfully authenticated, but GitHub does not
provide shell access.

来自Authenticating to GitHub / Using SSH over the HTTPS port


这是有用的信息,但与问题无关
M
Mark Tye

另请参阅:help.github.com 上的官方 Which remote URL should I use? 答案。

编辑:

似乎不再需要拥有对公共存储库的写入权限才能使用 SSH URL,从而使我原来的解释无效。

原来的:

显然,支持 HTTPS URL 的主要原因是,如果您没有对该存储库的写入权限,SSH URL 将无法与公共存储库一起使用。

但是,鼓励使用 SSH URL 部署到生产服务器 - 大概这里的上下文是像 Heroku 这样的服务。


“这些 URL 提供了通过 SSH 访问 git 存储库的权限。要使用这些 URL,您必须具有对公共存储库的写入权限或对私有存储库的任何访问权限。这些 URL 不适用于您没有写入权限的公共存储库“ - 这不是真的。任何人都可以使用他们没有写入权限的 SSH url 克隆公共 repo
@Sam 这可能不再是真的,但是当我回答这个问题时是真的。我已经编辑了我的答案以反映变化。
的确。 “GitHub 如何通过 SSH 推荐 HTTPS”这个问题是荒谬的。
b
benhorgen

有人可能会争辩说,使用 SSH 密钥进行身份验证的安全性较低,因为我们更倾向于定期更改密码,而不是生成新的 SSH 密钥。

限制使用 SSH 密钥的服务器可以帮助强制用户定期刷新 SSH 密钥的做法。


现在,让用户定期更改密码被认为是不好的建议。英国政府观点:ncsc.gov.uk/articles/problems-forcing-regular-password-expiry
t
tobylaroni

支持 HTTPS 的另一个原因是,如果多个用户在中央服务器(例如开发机器)上管理代码,则每个用户都需要创建自己的 ssh 密钥才能使用基于 SSH 的连接。如果连接是 HTTPS,则不存在此问题。

我想您可能会争辩说,将自己的密钥设置为使用存储该项目的服务器的入职培训的一部分并不难,但这是完成工作的另一个障碍。