目录
前言
本文来自阮一峰的网络日志。原来一直使用的是nfs
的方式来调试开发板,现在因为hlr
大神使用ssh
的方式进行调试,对ssh
也很有兴趣,特此搜集网络上的文章来进行学习!
数字签名与数字证书
加密方法
单钥加密
加密和解密都用同一套密码。单钥加密的情况下,密钥只有一把,一旦密钥泄漏,密码也就被破解了。目前,通用的单钥加密算法为DES(Data Encryption Standard
)。
双钥加密
加密和解密使用两套密码。双钥加密的情况下,密钥有两把,一把是公开的公钥,还有一把是不公开的私钥。双钥加密的原理如下:
- 公钥和私钥是一一对应关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之也成立。
- 所有的(公钥、私钥)对都是不同的。公钥可以解开私钥加密的信息,反之也成立。
- 同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的。
目前,通用的双钥加密算法为RSA(Rivest-Shamir-Adleman
)。
在双钥体系中,公钥用来加密信息,私钥用来数字签名。因为任何人都可以生成自己的(公钥、私钥)对,所以为了防止有人防止有人散布伪造的公钥骗取信任,就需要一个可靠的第三方机构来生成经过认证的(公钥,私钥)对。也就是说,可靠的第三方机构认证了一对双钥,这时候申请的公司就有了公钥和私钥,把自己的私钥交给受信任的客户,而自己用公钥加密,这时候如果私钥被认证,就可以确保文件有效。所以私钥不能泄漏。
本部分来自阮一峰的网络日志
数字签名
什么是SSH
?
SSH
是一种网络协议,用于计算机之间的加密登录,目前已经成为Linux
系统的标准配置。如果一个用户从本地计算机使用SSH
协议登录另一台远程计算机,可以认为这种登录是安全的,及时中途被截获,密码也不会泄露!(果然还要好好学习计算机网络)。
SSH
只是一种协议,存在多种实现,既有商业实现,也有开源实现。在linux
下的实现基于OpenSSH
,OpenSSH
是自由软件,应用广泛。
远程登录
SSH
主要用于远程登录。假定要以用户名user
登录远程主机host
,使用如下命令:
ssh usr@host
比如:
ssh pi@192.168.4.24
其中usr表示远程主机名,192.168.4.24表示远程主机的ip地址
如果本地用户名与远程用户名一直,登录时可以省略用户名
ssh host
SSH的默认端口是22,也就是登陆请求会送进远程主机的22端口。使用p参数可以修改这个端口。
ssh -p 2222 user@host
上面这条命令表示,ssh
直接连接远程主机的2222端口。
中间人攻击
SSH
之所以能够保证安全,原因在于它采用公钥加密。
整个过程如下:
- 远程主机收到用户的登陆请求,把自己的公钥发给用户
- 用户使用这个公钥,将登陆密码加密后,发送回来
- 远程主机用自己的私钥解密登陆密码,如果密码正确,就同意用户登陆。
这个过程本身是安全的,但是实施过程中如果有人截获登陆请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。SSH
协议的公钥没有证书中心公证,也就是说,都是自己签发的。
如果攻击者在用户与远程主机之间用伪造的公钥,获取用户的登陆密码,再用这个密码登陆远程主机,SSH
的安全机制就无效了。这种风险就是"中间人攻击"。
口令登录
如果是第一次登录对方主机,系统会出现如下提示:
The authenticity of host '192.168.4.24 (192.168.4.24)' can't be established.
ECDSA key fingerprint is SHA256:tOOZQyAp9po/RvbkdpmRrJKEmgWGBu4WAAFsd7WPKZ8.
这段话的意思是无法确认host
主机的真实性,只知道他的公钥指纹,是否继续连接?用户是无法知道远程公钥指纹是多少的,远程主机必须在自己的网站上贴出公钥指纹,以便用户自行核对。
假定经过风险衡量以后,用户决定接受这个远程主机的公钥。
Are you sure you want to continue connecting (yes/no)?
系统会出现一句提示,表示host主机已经得到认可。
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
之后,输入远程主机的密码即可:
Password: (enter password)
如果密码正确,就可以登陆了。当远程主机的公钥被接受之后,就会被保存在"/etc/ssh"目录下。下次再次连接这台主机,系统就会认出它的公钥,而跳过警告部分,直接提示输入密码。
最后,如果在远程连接了远程主机之后,使用exit
命令可以退出ssh
远程连接。
公钥登录
使用密码登录,每次都必须输入密码。SSH
还提供了公钥登录,可以省去输入密码的步骤。公钥登录就是用户将自己的公钥存储在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先存储的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码。
这种方法要求用户必须提供自己的公钥。如果没有现成的,可以用ssh-keygen生成一个:
ssh-keygen
运行上面的命令后,系统就会出现一系列提示,可以一路回车。运行结束后,在$HOME/.ssh
目录下,会新生成两个文件:id_rsa
和id_rsa.pub
。前者是公钥,后者是私钥。
这时在输入下面的命令,将公钥传送到远程主机host上面:
ssh-copy-id user@host
之后,登录就不再需要密码了。
如果失败,查看SSH原理与运用(一):远程登录中有这部分解决方法。博主在树莓派上直接成功,所以也就不需要了。