我只了解SSH身份验证过程的一半:我把我的公钥A给了GithubGithub加密数据然后发送给我我是唯一阅读它的人,因为我有私钥……
SSH服务器(GitHub)知道唯一可以访问存储库的人是具有私钥的人。只有拥有私钥的人才能解密其邮件。
所以服务器使用它。它生成一个随机数,用公钥加密它,并要求客户端读取它。如果他正确读取,他必须拥有私钥。
现在,当我推动时,我没有Github的公钥B在相反的方向上做同样的事情......或者它存储在某个地方?
Github.com在建立SSH连接时发送它的公钥。如果您在某种UNIX上使用OpenSSH,它将存储在文件中 $HOME/.ssh/known_hosts 。事实上,当你第一次通过SSH连接到Github时,当你对以下提示回答“是”时,它会到达那里:
$HOME/.ssh/known_hosts
主机'github.com(140.82.118.3)'的真实性无法确定。 RSA密钥指纹是SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8。 您确定要继续连接(是/否)吗?
通过回答“是”,您告诉SSH客户端您信任具有指定哈希的公共部分的密钥的所有者 nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 。这可以确保您连接到真正的github.com而不是某些冒充github.com的欺诈主机。 (请注意,给定的指纹与官方github上的指纹匹配 SSH帮助页面 。)下次连接到主机并从中接收公钥时,OpenSSH将遍历条目 known_hosts 文件,找到相应的指纹,并假设主机是真实的,不会再提示你。
nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
known_hosts
但这都是关于Github对你的认证,我。即 的 你是否信任服务器 强> 。
现在到第二部分,其中涉及到证据 的 您对服务器的真实性 强> :
此外,如果它的工作原理如此,如果有人想要推送东西,他只需要窃取与我的账户关联的Github的“给予/存储在.git中”的公钥B并推送我不想要的东西
不是这样的。 Github只允许私人密钥的所有者使用任何类型的东西,公共对应方在您的帐户首选项页面上注册。窃取公钥是没有意义的,因为它是 上市 ,即它不是秘密。
让我们假设有人知道您的Github帐户的公钥,并尝试将一些更改推送到您的仓库。他连接到Github并将您的公钥发送给它,以便Github相信它正在与真实账户所有者交谈。但是为了确保Github使用只有私钥所有者才能完成的解密任务来挑战客户端。由于只有您拥有帐户的私钥,因此只有您可以代表您推送您的回购。这就是为什么你应该小心保管你的私钥。