如果您遵循 GitHub HowTo “生成 SSH 密钥”,您会在~/.ssh
目录中获得三个文件:known_hosts
、id_rsa
和id_rsa.pub
.
该文件known_hosts
用于服务器身份验证,id_rsa
用于客户端身份验证(这是一篇文章,解释了区别)。
为什么我应该创建/为什么 GitHub 确实需要主机和用户身份验证文件?GitHub 身份验证如何工作?
谢谢
这只是普通的旧 SSH 身份验证;没有什么是 GitHub 特有的。
id_rsa
并且id_rsa.pub
是您的密钥的两半:私钥和公钥。实际上,公钥是私钥的锁。您将锁(公钥)放在您想要轻松访问的任何服务器上,而不必太担心其他人会看到它,因为它只是一把锁。您将(私人)密钥保存在您的机器上,并使用它来登录这些服务器;他们看到你有一把适合锁的钥匙,然后让你进去。
(并不是说您应该将您的公钥放在完全不可信的机器上;有些恶意技巧可以利用诸如 .) 之类的快捷方式ssh -A
。)
known_hosts
实际上与此没有太大关系;它只是ssh
存储您连接到的所有服务器的指纹的地方,因此如果指纹发生变化,它可能会引发一个可怕的警告。(这意味着它不是同一台机器:要么服务器端发生了根本性的变化,要么你的连接被劫持了。)
所以,无论如何,Git 本身理解的协议之一就是 SSH。当您git@github.com:...
用作存储库 URL 时,Git 只是通过 SSH 连接。当然,GitHub 不希望你在他们的机器上乱搞,所以他们只让你做 Git 的事情,而不是得到一个完整的 shell。
像往常一样,Arch wiki在这方面有更多的文字。
known_hosts
在您第一次连接时存储服务器的身份,以便您下次连接到同一台服务器时知道。这可以防止有人在您下次连接时假装是服务器(但遗憾的是不是第一次)
id_rsa
是你的密钥,证明你是真的你。永远不要放弃这个。
id_rsa.pub
是公钥,其身份验证的目的基本上只是为了证明您拥有密钥而不给出它。您可以将此密钥提供给任何需要它的人,因为它没有任何秘密。
当您连接到服务器时,SSH 首先检查服务器是否有正确的密钥(即它应该与 . 中的那个匹配known hosts
。如果客户端认为服务器是真实的,它会使用其私钥对以下数据进行签名并发送它到服务器;
string session identifier
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "publickey"
boolean TRUE
string public key algorithm name
string public key to be used for authentication
服务器使用公钥(您之前上传到 Github)验证签名,如果正确,则客户端通过身份验证。
每当您实际通过 SSH 连接到主机时,ssh 都会使用 known_hosts 文件。它为服务器存储各种签名密钥。然后,如果它改变了,你就会知道。
ssh-keygen -t rsa -C yourgithub@accountemail.com
用于生成 SSH 密钥,您将在其中将其提供id_rsa.pub
给 github。id_rsa
然后,当您连接到 github 时,您的文件夹中有私钥~/.ssh
,然后用于通过 github 验证您的信息。
这是一个非常底层的解释,但是私钥(非 .pub)文件是你的目的,.pub 是给 github 的,known_hosts 是让你的盒子知道什么是什么。
您还可以生成一个config
文件~/.ssh
用于指定哪个密钥转到哪个主机..
authorized_keys 和 known_hosts完全不同..
您的 SSH 服务器(sshd,即)使用authorized_keys,或在您的内部定义的任何文件,/etc/ssh/sshd_config/
用于了解另一个密钥的公共方面。因此,当用户连接到您的服务器时,他们会传递他们的私钥,您的 SSH 服务器会根据它在 authorized_keys 中的公钥进行验证,如果不匹配,它就不起作用。
Githubauthorized_keys
对他们的用户保持着一个可以这么说的方式。您的公钥进入您帐户上的 authorized_keys,然后当您通过 ssh 连接到克隆、推送等时,它会检查您发送的私钥以及他们已经知道的公钥。