SSH协议和公钥私钥问题

经常使用ssh协议,却对其不够了解,很多知识点接触到却没记录下来,本文记录一下对SSH协议的一些知识,以及公钥,私钥,加密,数字签名等等知识点.全文来自网络文章总结.

SSH初探

什么是SSH协议?

以下来自wiki百科:

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境[1]。
SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接[2]。
虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。
使用频率最高的场合类Unix系统,但是Windows操作系统也能有限度地使用SSH。2015年,微软宣布将在未来的操作系统中提供原生SSH协议支持

从SSH远程登录VPS讲起

1
2
3
4
5
# 指定端口(默认22)和登录账号
ssh root@host -p 2222

# 如果账号和当前系统账号一致,则可以使用如下命令
ssh host

我经常遇到的一种情况是,首次登录一个主机:

1
2
3
4
5
6
7
  $ ssh user@host

  The authenticity of host 'host (12.18.429.21)' can't be established.

  RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.

  Are you sure you want to continue connecting (yes/no)?

如上所示,连接无法建立,并且给出了RSA key指纹,这玩意是什么,可以看文章末尾的推荐.
RSA加密的指纹被显示为128位的指纹,对于未知的主机,一般友好地提示是否继续连接.

如果我们输入yes,则表示信任此主机,并且将会被要求输入密码进行连接.如果密码正确,则此远程主机的此公钥将会存入本地$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。

除了用户拥有信任的公钥之外,操作系统也会保存一些信任的密钥在/etc/ssh/ssh_known_hosts中.

如何跳过输入密码验证的流程,直接登录远程主机?

使用ssh-keygen生成一个公钥,运行结束以后,在$HOME/.ssh/目录下,会新生成两个文件:id_rsa.pub和id_rsa。前者是你的公钥,后者是你的私钥。

这时再输入下面的命令,将公钥传送到远程主机host上面:

1
$ ssh-copy-id user@host

其原理是:将公钥发给远程主机,请求登录的时候远程主机发送一段随机字符串,本地主机用私钥加密后发回去,远程主机用本机的公钥去解密,如果解密成功,则信任本地主机的连接请求,不会再需要输入
密码.

前提是:

远程主机上的/etc/ssh/sshd_config这个文件,检查下面几行前面”#”注释是否取掉。

1
2
3
  RSAAuthentication yes
  PubkeyAuthentication yes
  AuthorizedKeysFile .ssh/authorized_keys

ps:修改ssh配置需要重启服务生效

远程主机将用户的公钥,保存在登录后的用户主目录的$HOME/.ssh/authorized_keys文件中。

公钥和私钥

  • 公钥和私钥成对出现,公钥是可以公开的,私钥可以理解为私人的.
  • 公钥和私钥都可以用于加密和解密,关键在于,用公钥加密,则私钥可以解密,用私钥加密,则对应的公钥可以解密
  • 公钥和私钥是相对的

非对称加密流程

简单来说就是:

  • vps生成公钥和私钥
  • 将公钥发出来,我用此公钥加密我的密码,发过去的内容加密后的字符串
  • 私钥直接解密,就可以得到明文密码去验证身份.

大佬的图都很灵性啊!

数字签名

数字签名的作用是:验证身份

我用我的私钥去加密我的数据,即可形成我的数字签名.其他人收到加密后的数据,用我的公钥(我发出去,或者公布的)即可解密,同时,可以确定这是我本人原始的数据.

没有经过他人的修改.我甚至没法否认这数据不是我的,因为只有我私钥加密的数据才能用我的公钥解密得到可以辨别数字签名的数据.毕竟,私钥只有我有.

非对称加密的缺点

效率低

优化的方法很复杂,并非我现在的水平能够接触的,待续…

免密登录服务器

首先确定本地存在公钥和私钥,如果不存在就创建公钥和私钥.

免密登录的原理是将本地公钥上传到服务器的相关用户主目录下的.ssh/authorized_keys文件中.
另外,还需要注意:

  • 将.ssh目录的权限为700
  • 将authorized_keys目录的权限为600

于是,我们登录服务器的时候就不需要输入密码了,为了实现极简的登录,可以优化一下本地文件:
~/.ssh/config

1
2
3
4
5
Host vps
HostName 192.168.1.1
Port 12345
User username
IdentityFile ~/.ssh/id_rsa

接着,可以这样免密登录名为vps的远程服务器了:

1
ssh vps

推荐大神的文章

SSH原理与运用(一):远程登录 - 阮一峰的网络日志
理解公钥与私钥 | 神奕的博客
中间人攻击 - MBA智库百科
公开密钥指纹 - 维基百科,自由的百科全书
RSA加密算法 - 维基百科,自由的百科全书
数字签名是什么? - 阮一峰的网络日志
让大象起舞:HTTPS 计算性能优化 - 云+社区 - 腾讯云