简介
SSH是一种网络协议,用于计算机间远程加密登录。相比Telnet明文传输的方式,SSH采用非对称加密进行密文传输,让数据传输更加可靠。
简单使用
远程登录
$ ssh -p port username@host
-p:指定登录占用的端口,默认为22username:登录远程主机的用户名host:远程主机的host
登录方式
非对称加密
一个常见的非对称加密模型,与https不同的是:ssh的公钥是未经CA认证的,由服务端自己签发。
- 服务端签发一对公钥和私钥。
- 收到用户登录请求时,服务端将公钥发生给客户端。
- 客户端使用服务端的公钥对登录密码进行加密。
- 服务端接收到报文后用自己的私钥进行解密,查看密码是否正确。
口令登录
但是由于签发的过程不经过CA认证,就会存在中间人攻击的风险。及中间人服务使用伪造的公钥捕获用户正确的登录密码,再用这个密码去登录服务端主机。而ssh采用口令登录的方式来解决这个问题 -- 让用户通过自行比较公钥指纹的方式评估远程主机是否可信。
- 用户初次登录远程主机会提示无法确定主机的真实性并返回公钥指纹
- 远程主机需要提供
MD5计算后的公钥指纹,以供用户查阅比对 - 用户选择接收远程主机的公钥
- 用户输入密码以登录远程主机
- 后续的流程中无需再度进行比对的工作
公钥登录
每次登录都要输入密码略显麻烦,那么有没有一种一键登录的方式呢?答案是肯定的。
既然远端可以签发公钥、私钥,那当前主机也可以。
使用ssh-keygen生成一对公钥、私钥,其存储在~/.ssh/下对应id_rsa.pub和id_rsa两个文件。
接着输入ssh-copy-id user@host 即可将公钥传输给远程主机。
酷酷的应用场景
ssh不仅可以安全地进行远程登录,你还可以用ssh隧道传输流量、传输文件、安装远程文件系统等等。
ssh隧道允许ssh作为代理服务器,由于ssh密文传输的特性,数据可以安全地发送到ssh服务器。
文件传输
你可以用下面命令创建一个ssh socket
ssh -D 8888 -C user@host
然后你可以使用scp命令上传、下载文件
# 上传到远端ssh代理
# 文件
scp localFilePath user@host:remoteFilePath
# 文件夹
scp -r localFolder user@host:remoteFolder
# 从远端下载
# 文件
scp user@host:remoteFilePath localFilePath
# 文件夹
scp -r user@host:remoteFolder localFileFolder
可视化指纹
前面提到远程主机需要提供以供客户端校验使用的公钥(经过MD5加密后的字符串),长长的字符串难以进行比对,于是就产生了可视化指纹。
# 事实上,执行ssh keygen 后控制台会打印生成后的指纹
ssh-keygen
# 它看起来像是这样
+---[RSA 2048]----+
| .+... . |
| +o. o |
| o.. oo.. |
|+o. +*.o |
|+.. E.=So . |
|.. o== = |
| .=..+oo |
| +=o+= . |
| .++=.o* |
+----[SHA256]-----+