Learn Version Control with Git
A step-by-step course for the complete beginner
Learn Version Control with Git featured image

使用 SSH 公钥验证

通常情况下,访问远程服务器上的 Git 仓库要受到限制。你可能不希望任何人都能读取文件,或者至少不能改动文件吧。在这种情况下,进行有效的认证就是非常必要地。

你可能已经通过你所使用的浏览器了解了 “HTTPS” 协议,尽管它使用起来很简单,但是很多系统管理员还是会出于各种原因去选择使用更为普遍的 “SSH” 协议。在这种协议之下,当涉及到身份验证时,你就很可能需要 “SSH公钥”。
对于这种类型的验证需要一对密钥:一个公钥和一个私钥。私钥,顾名思义就是必须在任何情况下都保持绝对私有。它所对应的公钥则相反,应该是被安装到那些你需要登陆的服务器上。
当通过 SSH 试图建立连接时,如果客户端提供的私钥能和在服务器上所安装的公钥相匹配,那么这个客户端才会被授予访问权限。

创建一个公钥

在创建公共密钥前,你应该检查一下是否已经存在了一个:

$ ls ~/.ssh

如果在输出列表里已经存在了一个名为 “id_rsa.pub” 或是 “id_dsa.pub” 的文件,这就代表你已经有了一个密钥。在这种情况下,你可以把这个文件发给你的服务器管理员。如果你使用的是像 GitHub 或 Beanstalk 这样的托管服务,那就要把它上传到你的帐户中。

如果还没有任何密钥,你只须要执行下面这个命令来创建一个:

$ ssh-keygen -t rsa -C "john@example.com"

在 “-t” 参数之后,我们请求建立一个 “RSA” 类型的密钥。RSA 是当前最新并且最安全的一种形式。在 “-C” 参数之后,我们提供了一个注释,你可以把它想象为对这个密钥的一种描述或标签。例如使用你的 email 地址。总之,一个能让你之后更容易识别的注释。
在确认此命令后,您会被询问一些信息:

  • (1) 给这个新的密钥输入一个名称,保留默认的名字和设置。
  • (2) 提供一个密码。虽然 SSH 公钥可以确保在没有任何密码的情况下安全地使用,但是你还是应该设置一个密码,用来进一步提高安全性。
$ ssh-keygen -t rsa -C "john@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tobidobi/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/tobidobi/.ssh/id_rsa.
Your public key has been saved in /Users/tobidobi/.ssh/id_rsa.pub.
The key fingerprint is:
87:23:34:de:35:d0:f2:78:05:a4:78:1b:f1:6a:7e:be john@example.com
The key's randomart image is:
+--[ RSA 2048]----+
|    . = o        |
|   ..o..         |
|  . o S .        |
| . .      . o    |
|  . + + . o      |
|   . S = + o.    |
|    . . + + . o  |
|       o .       |
|              o .|
|              .Eo|
+-----------------+

现在,两个密钥文件被创建出来了:“id_rsa.pub”(你的公钥)和 “id_rsa”(你的私钥)。如果你使用的是 Mac,你可以在你 home 目录下的 “.ssh” 目录中找到它们(~./ssh/)。在 Windows 中,它们应该存放在 C:\Documents and Settings\your-username.ssh\ 或是 C:\Users\your-username.ssh 中。

如果你想看看你的公钥文件的实际内容,你将会看到这些内容:

$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322+Au/9yy9oaABBRCrHN/yo88BC0AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322AB3nZaC1aycAAEU+/ZdulUJoeuchOUU02/j18L7fo+ltQ0f322klCi0/aEBBc02N+JJP john@example.com

这就是公钥的内容,你需要把它安装在你所需要登陆的远程服务器上。如果你的项目开发团队拥有自己的服务器,那么你只需要把它提供给你的服务器管理员就可以了。如果你使用的是像 GitHub 或 Beanstalk 这样的托管服务,你则必须把它上传到你的帐户上。

你要把公钥的内容完全一模一样地复制出来,你可以使用下面的命令来安全方便地复制这些内容到你的剪贴板上:

$ pbcopy < ~/.ssh/id_rsa.pub            [on Mac]
$ clip < ~/.ssh/id_rsa.pub              [on Windows]

About Us

As the makers of Tower, the best Git client for Mac and Windows, we help over 100,000 users in companies like Apple, Google, Amazon, Twitter, and Ebay get the most out of Git.

Just like with Tower, our mission with this platform is to help people become better professionals.

That's why we provide our guides, videos, and cheat sheets (about version control with Git and lots of other topics) for free.