0%

如何设置 SSH 免密登录

ssh
前面写的将博客迁移到阿里云的文章中,没有详细说明如何设置 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

之后提示输入密钥的密码,这是为了防止密钥被泄漏,被别人利用的风险,只是自己来用的话可以不用设置密码,直接回车就行

确认密码时继续回车

此时密钥就生成好了,有类似下提示(你的一定与下面的不同,因为生成过程是随机的):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your identification has been saved in /home/alisx/id_rsa
Your public key has been saved in /home/alisx/id_rsa.pub
The key fingerprint is:
SHA256:K7H4cfgm0oIutSJ4Pq61e9253JBf40tLQnYiY6WDfv8 alisx@alisx-HP-EliteBook-840-G2
The key's randomart image is:
+---[RSA 3072]----+
| |
| |
| . |
| . o |
| o S + . |
| . o = O o |
|...o.o*.*.. = |
|=.=.+.+B+= * o |
|oO*+ o.o+.+.E. |
+----[SHA256]-----+

然后在刚才输入的密钥目录,就会有 id_rsaid_rsa.pub 两个文件,分别是私钥文件和公钥文件(文件名,取决于输入的密码文件名)

puttygen

putty 实现了 SSH,不过密钥文件格式与 OpenSSH 有所不同,所以在将公钥推送到 Linux 服务器上时,需要转化成 OpenSSH 的密钥文件格式

打开 puttygen

一般会随 putty 一起安装,与 putty 在同一目录下,putty 在这里下载: https://puttygen.com/download.php?val=4

点击 Genrate 按钮

生成

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

生成过程

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

密钥信息

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

OpenSSH 公钥

2 向服务器推送公钥

需要将公钥内容让远程服务器知道,才能用对应的私钥登录

ssh-copy-id

Linux 中,可以用 ssh-copy-id 来推送,在终端中输入:

1
ssh-copy-id -i <公钥文件路径>  <user>@<服务器名或者 IP >

如果服务可以联通,且是第一次连接的话,会得到提示是否确认远程服务器的指纹,确定没有连接错主机的话,输入 yes

实际上 确定没有连接错主机 不够严谨,如果主机是通过主机名连接的,可能会有 DNS 攻击风险,看起来连上了,实际上连接的是别的机器,请注意

然后输入登录密码(因为还没有密钥,需要用密码登录),完成推送

此时就可以用密钥登录服务器了

1
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 文件夹,就需要创建一个

1
mkdir ~/.ssh

在创建 authorized_keys 文件

1
touch ~/.ssh/authorized_keys

然后,修改 .ssh 目录 和 authorized_keys 文件的权限

1
2
3
chmod 700 ~/.ssh

chmod 600 ~/.ssh/authorized_keys

请注意: 修改权限很重要,否则将无法使用密钥连接

完成后,就可以向 authorized_keys 中粘贴公钥内容了

如果在 Windows 中安装了 Git,可以在 Git Bash 环境下使用 Linux 命令,即可以像 Linux 一样创建密钥

3 连接

设置完成后,就可以免密连了

Linux 下,使用 ssh 命令

1
ssh u<user>@<服务器名或者 IP >

Putty 中需要设置:

Putty 设置

注意 Putty 使用的私钥文件后缀名是 .ppk,即通过 Save private key 按钮

总结

今天简单说明了下如何设置 SSH 免密登录,实际上设置过程比较简单。同时了解了下 SSH 协议,它是计算机安全领域的基础协议,同时验证了一句话:重要的东西往往是简单的。

参考