# 使用 SSH 公钥验证
通常情况下,访问远程服务器上的 Git 仓库要受到限制。你可能不希望任何人都能读取文件,或者至少不能改动文件吧。在这种情况下,进行有效的认证就是非常必要地。
你可能已经通过你所使用的浏览器了解了 “HTTPS” 协议,尽管它使用起来很简单,但是很多系统管理员还是会出于各种原因去选择使用更为普遍的 “SSH” 协议。在这种协议之下,当涉及到身份验证时,你就很可能需要 “SSH公钥”。
对于这种类型的验证需要一对密钥:一个公钥和一个私钥。私钥,顾名思义就是必须在任何情况下都保持绝对私有。它所对应的公钥则相反,应该是被安装到那些你需要登陆的服务器上。
当通过 SSH 试图建立连接时,如果客户端提供的私钥能和在服务器上所安装的公钥相匹配,那么这个客户端才会被授予访问权限。
![](https://box.kancloud.cn/2016-05-04_572967e74f38b.png)
## 创建一个公钥
在创建公共密钥前,你应该检查一下是否已经存在了一个:
```
$ 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]
```
- Learn Version Control with Git 中文版
- 前言
- Part 1 - 基础知识
- 什么是版本控制?
- 为什么要使用版本控制系统?
- 准备工作
- 版本控制的基本工作流程
- 从一个未被纳入版本控制的项目开始
- 从一个已被纳入版本控制的项目开始
- 工作在你的项目上
- Part 2 - 分支与合并
- 分支可以改变你的生命
- 在分支上工作
- 暂时保存更改
- 切换一个本地分支
- 合并改动
- 分支的工作流程
- Part 3 - 远程仓库
- 关于远程仓库
- 连接一个远程仓库
- 查看远程数据
- 整合远程的改动
- 发布一个本地分支
- 删除分支
- Part 4 - 高级应用
- 撤销操作
- 用 diff 来检查改动
- 处理合并冲突
- Rebase 代替合并
- 子模块
- git-flow 的工作流程
- 使用 SSH 公钥验证
- Part 5 - 工具与服务
- 桌面应用程序
- 比较和整合工具
- 代码托管服务
- 更多学习资源
- 附录
- 版本控制的最佳实践
- 命令 101
- 从 Subversion 过渡到 Git
- 为什么选择 Git