树莓派-ssh密码及公钥登入

Posted by 周思进 on December 27, 2020

一、SSH 登入

树莓派系统在 sd卡 烧录好后,可以直接在 sd 卡里创建个 ssh 空白文件,这样就默认打开 ssh 服务了。

系统启动后,就可以使用如下命令方式 ssh 登入

ssh -p port 用户名@远程主机iP

如果端口默认就是22,则可以省去 -p 选项

因为树莓派支持 bonjour 协议,如果设备 IP 是 DHCP 分配的,搞不清当前的 ip 地址(当然,你可以手机安装个 bonjour 搜索工具来查找),则可以通过如下命令登入


二、SSH 登入原理

SSH 登入过程大致如下:
1、客户端发送SSH登入请求
2、服务器将公钥发送给客户端
3、客户端使用该公钥加密登入密码传递给服务器
4、服务器用私钥解码获取登入密码进行校验

这里公钥的传递不像 https 那样通过证书的形式进行传递,所以就无法像证书那样通过 CA 证书去校验证书的合法性以此来判断公钥的合法性。

实际只能让用户自己去确认是否可信,当第一次登入时,系统会提示如下信息:

The authenticity of host ‘192.168.2.2 (192.168.2.2)’ can’t be established. ECDSA key fingerprint is SHA256:z83o30gAyPv6B09lufS4yZLPHoYWTmDjt/q3AWeEox4. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added ‘192.168.2.2’ (ECDSA) to the list of known hosts.

当选择 yes 后,该服务器的公钥就会存储在 $HOME/.ssh/known_hosts 文件中。下次再连接该服务器,系统检测对方公钥已存储在本地,则不会再提示警告,直接让你输入密码。


如果后面登入出现如下错误信息:

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

这是本地存储的公钥和对方实际发送过来的公钥不匹配了,在确认对方公钥可信的情况下(比如树莓派系统重装了或者 openssh-server 重装了) ,可以执行以下命令即可

ssh-keygen -R 远程IP

实际就是把你本地 known_hosts 中存储的该服务器 IP 对应的公钥数据进行删除。


三、公钥登入

ssh 除了密码登入,还支持公钥登入。

公钥登入流程,和上面说的密码登入流程不同,其过程如下:
1、客户端发送SSH登入请求
2、服务器发送一串随机串给客户端
3、客户端使用自己的私钥加密该随机串发送给服务器
4、服务器收到后用公钥进行解密,解密结果和自己发送的数据一致则认证通过

无论是用密码登入,还是公钥登入,都是用了公私钥的特性,公钥加密的数据只能私钥解密,私钥加密的数据只能公钥解密。密码登入使用的前者,而公钥登入使用的后者。

那么公钥登入是客户端存储私钥,而公钥存放到服务器上。所以一般也是在客户端产生公私钥对,保证私钥的机密性。

通过如下命令创建公私钥对:

ssh-keygen 

该命令默认在 $HOME/.ssh/ 目录下生成 id_rsa 私钥和 id_rsa.pub 公钥,然后将公钥数据写入到要远程的服务器上,通过如下命令:

ssh-copy-id 用户名@远程主机ip

执行完后,公钥数据就写入到远程服务器的 .ssh/authorized_keys 文件中了。

要通过公钥登入,还需要配置下服务器的 ssh 服务

sudo vim /etc/ssh/sshd_config 

修改如下配置
RSAAuthentication yes
PubkeyAuthentication yes
然后重启服务

sudo systemctl reload sshd

这样登入的时候,你就发现不需要输入密码了,直接完成登入操作。 当然如果想提高安全性,你可以关闭密码登入方式,可修改如下配置
PasswordAuthentication no


四、基于 ssh 传输文件

可以通过 scp 命令基于 ssh 协议完成文件传输
1、将本地文件传输到服务器上
scp localfile_path 用户名@远程主机ip:remote_path

2、将服务器上的文件拷贝到本地
scp 用户名@远程主机ip:remotefile_path local_path