前面写的将博客迁移到阿里云的文章中,没有详细说明如何设置 SSH 公钥免密登录,今天就这个话题详细说明一下,希望对有自己服务器或者对服务器管理感兴趣的朋友有所帮助
## 什么是 SSH
SSH 是一种网络协议,用于计算机之间的加密登录,如果使用 SSH 协议登录远程计算机,就可以认为是安全登录,即使通信数据保被截获,密码或者内容也不会泄漏。
SSH 是 1995 年,芬兰学者 Tatu Ylongen 设计的,推出之后迅速在全世界推广开,已然成为互联网安全的一个基本解决方案,而且成为了 Linux 系统的标配
SSH 只是一种协议,存在不同版本的实现,在 Linux 中,标配的是 OpenSSH 开源实现,还记得有场罗永浩的手机发布会,将全部的门票收入捐赠给了 OpenSSH,Windows 上,用的实现了 SSH 协议的 Putty 软件
## 为什么要免密
ssh 支持密码登录和公钥登录,无论是用哪种方式,通信都是经过加密的,是安全的
不过用密码登录不方便,每次都需要输入用户名,密码,很不方便,同时增加密码泄漏的风险
另外在一些软件,如 Git,提供了 SSH 支持,会使开发效率更高,同时不必存储明文密码
作为运维人员,需要同时管理多台机器,记住每台的密码是困难和不可考的,通过 SSH 公钥将大大减轻工作负荷
……
## 设置 SSH
了解了 SSH 的基本情况,下面了解下设置步骤
### 1 制作密钥对
SSH 的密钥需要有足够的安全性,另外需要有一定的格式,每个实现 SSH 协议的软件,都提供了密钥生成工具,Linux 中的是 ssh-keygen, Windows 中 Putty 会带一个 puttygen
下面分别做下声明
#### ssh-keygen
打开终端,输入 `ssh-keygen`
然后会提示输入密钥文件存储位置及名称,默认会在当前登录用户家目录下,密钥文件名为 id\_rsa
之后提示输入密钥的密码,这是为了防止密钥被泄漏,被别人利用的风险,只是自己来用的话可以不用设置密码,直接回车就行
确认密码时继续回车
此时密钥就生成好了,有类似下提示(你的一定与下面的不同,因为生成过程是随机的):
```
Your identification has been saved in /home/alisx/id_rsaYour public key has been saved in /home/alisx/id_rsa.pubThe key fingerprint is:SHA256:K7H4cfgm0oIutSJ4Pq61e9253JBf40tLQnYiY6WDfv8 alisx@alisx-HP-EliteBook-840-G2The key's randomart image is:+---[RSA 3072]----+| || || . || . o || o S + . || . o = O o ||...o.o*.*.. = ||=.=.+.+B+= * o ||oO*+ o.o+.+.E. |+----[SHA256]-----+
```
然后在刚才输入的密钥目录,就会有 `id_rsa` 和 `id_rsa.pub` 两个文件,分别是私钥文件和公钥文件(文件名,取决于输入的密码文件名)
#### puttygen
putty 实现了 SSH,不过密钥文件格式与 OpenSSH 有所不同,所以在将公钥推送到 Linux 服务器上时,需要转化成 OpenSSH 的密钥文件格式
打开 puttygen
> 一般会随 putty 一起安装,与 putty 在同一目录下,putty 在这里下载:https://puttygen.com/download.php?val=4
点击 `Genrate` 按钮

生成
然后在空白区域随即晃动鼠标,以便生成随机量,产生更安全的密钥对

生成过程
生成完后,就能看到密钥信息了

密钥信息
通过 `Save public key` 和 `Save private key` 按钮保存的密钥文件格式是 Putty 的,OpenSSH 格式的公钥在上面的只读文本框里,选择复制,粘贴到文本文件中,例如命名为: `id_rsa.pub`,就得到了 OpenSSH 格式的公钥文件了

OpenSSH 公钥
### 2 向服务器推送公钥
需要将公钥内容让远程服务器知道,才能用对应的私钥登录
#### ssh-copy-id
Linux 中,可以用 ssh-copy-id 来推送,在终端中输入:
```
ssh-copy-id -i <公钥文件路径> <user>@<服务器名或者 IP >
```
如果服务可以联通,且是第一次连接的话,会得到提示是否确认远程服务器的指纹,确定没有连接错主机的话,输入 yes
> 实际上 `确定没有连接错主机` 不够严谨,如果主机是通过主机名连接的,可能会有 DNS 攻击风险,看起来连上了,实际上连接的是别的机器,请注意
然后输入登录密码(因为还没有密钥,需要用密码登录),完成推送
此时就可以用密钥登录服务器了
```
ssh u<user>@<服务器名或者 IP >
```
> 需要注意的是,在 Linux 下用 ssh 登录远程服务器,会在当前家目录 .ssh 下找私钥,如果私钥没在 .ssh 下,需要用参数 `-i` 指定私钥路径
>
> 另外请注意,ssh-copy-id 中 `-i` 指定的是要推送到服务器的公钥,ssh 中 `-i` 指定的是私钥
#### 手工推送
Windows 下没有 ssh-copy-id 工具,需要手工向服务器推送
使用用户名,密码连接到远程主机,打开用户家目录下 `.ssh/authorized_keys` 文件,将刚才用 puttygen 生成的 id\_rsa.pub 文件内容(注意只有一行),粘贴到 `authorized_keys` 中即可
对于新主机,或者服务器上的新用户来说,没有 `.ssh` 文件夹,就需要创建一个
```
mkdir ~/.ssh
```
在创建 `authorized_keys` 文件
```
touch ~/.ssh/authorized_keys
```
然后,修改 `.ssh` 目录 和 `authorized_keys` 文件的权限
```
chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys
```
> 请注意:**修改权限很重要,否则将无法使用密钥连接**
完成后,就可以向 `authorized_keys` 中粘贴公钥内容了
> 如果在 Windows 中安装了 Git,可以在 Git Bash 环境下使用 Linux 命令,即可以像 Linux 一样创建密钥
### 3 连接
设置完成后,就可以免密连了
Linux 下,使用 `ssh` 命令
```
ssh u<user>@<服务器名或者 IP >
```
Putty 中需要设置:

Putty 设置
> 注意 Putty 使用的私钥文件后缀名是 `.ppk`,即通过 `Save private key` 按钮
## 总结
今天简单说明了下如何设置 SSH 免密登录,实际上设置过程比较简单。同时了解了下 SSH 协议,它是计算机安全领域的基础协议,同时验证了一句话:重要的东西往往是简单的。
## 参考
- http://www.ruanyifeng.com/blog/2011/12/ssh\_remote\_login.html
- https://jingyan.baidu.com/article/ea24bc39b42ec2da62b331df.html
- https://www.cnblogs.com/ljmjjy0820/p/8045298.html

<center><font color="#686868" >关注我 获得更多精彩</font></center>