作为开发者,所开发的每一个应用在成型后都需要部署,虽然我们使用着各式各样的部署工具,但是其背后最本质的东西完全一样,便是如何与服务器交互,而交互的第一步便涉及到登录。
一. 认识ssh
SSH(Secure Shell),译做“安全shell”,如何做到安全?便是通过加密算法将需要传输的数据进行处理后,通过TCP传输,在两端之间通过密文交互达到安全目的,所以它的本质即数据的加密。
SSH在目前一共有两个不兼容的版本,区别在于各自采用的加密方式不相同。SSH1使用了在加密对称加密秘钥的时候使用了非对称加密算法(RSA), 使用了循环冗余校验码(CRC)来保证传输数据的完整。SSH2则使用了新的对称加密算法和替代RSA加密秘钥的算法,并且使用散列值(HMAC)算法替代CRC来保证传输数据的完整。
二. SSH认证
SSH的用户认证方式有两种,第一种是账户密码登录,即你需要连接的远程服务器某一个用户与密码,比较常用,也比较简单。第二种是公钥验证授权登录,这一种认证较为复杂,但是配置好后其后续操作将十分便捷,本次也主要梳理该种认证方式原理及其流程。
三. 免密登录
1. 免密本质
如果将输入密码登录比作拿钥匙开门,那么免密登录可以理解为刷脸或者刷指纹开门,而刷脸和录指纹的操作便是你在此之前已经在开门认证的可信任数据库中录下来,在录下来之后才体会到开门不用钥匙便捷。所以,免密登录的前提就是远端的服务器能够认识你的机器,而你的机器“刷脸”(免密)进门就需要把它的“脸”(公钥)放到远端的服务器的可信列表里。
2. 实现
a. 生成公私钥
# 生成秘钥
ssh-keygen -t rsa -C “your_email@gmail.com”
b. 将本地的公钥上传至远程服务器的用户信任列表
# 将公钥id_rsa.pub同步至服务器(10.11.xx.xx)地址的user用户下
ssh-copy-id -i ~/.ssh/id_rsa.pub user@10.11.xx.xx
c. 检查远程服务器可信任列表
cd ~/.ssh/
# 查看可信任公钥列表里,存在你的公钥
cat authorized_keys
d. 免密验证
ssh user@10.11.xx.xx
e. 别名配置
由于ip是一段无序的数字,要是不记在心里,则需要每次登陆服务器都翻笔记找对应ip,是比较费劲的,这时候可以给它起一个好记的别名,比如你的服务器在美国,可以叫usa_server,当你链接它的时候直接ssh别名就可以了,仅需要在你本地简单配置一下即可。
# 进入.ssh
cd ~/.ssh/
# 新建config
vim config
# 添加以下内容
Host usa_server
HostName 10.11.xx.xx
User user
Port 22
# 保存
# ssh别名链接验证
ssh usa_server
四. 认证原理
1.输入密码(口令)验证
用户在客户端ssh远程服务器,远程服务器将自己的公用密钥下发至客户端的~/.ssh/known_hosts,客户端将使用该公开密钥来加密数据,远程服务器使用自己的私有密钥来解密数据,从而实现加密访问过程。
2. 免密登录(秘钥)验证
首先在客户端创建一对密匙,ssh-copy-id把公钥放在远程服务器的可信任列表中cd ~/.ssh/authorized_keys。
当客户端SSH连接服务器时,客户端携带着公钥向服务器发出链接请求,远端服务器收到请求后,在 ~/.ssh/authorized_keys信任文件里比对该公钥是否存在,如果对比成功,远端服务器则使用该公钥加密一个随机字符串(challenge),然后发送给客户端。客户端接收到该服务器回来的请求后,将随机字符串(challenge)用自己的私钥进行解密,之后再将解密后的结果传给远端服务器,远端服务器对比传来的字符串是否一致,一致则建立连接。
3. 两种方式简单比较
从原理层面上就可看出,第一种验证方式相比于第二种的步骤稍微简单一些,即代表第一种在连接时更快一些。但是第二种方式则更加安全一些,因为第一种方式并不能完全保证你所连接的机器就是你想连接的机器,存在“中间人攻击”的风险。
如上内容均为自己总结,难免会有错误或者认识偏差,如有问题,希望大家留言指正,以免误人。有什么问题请留言,会尽力回答之。
如果对你有帮助不要忘了分享给你的朋友或者点击右下方的“在看”哦!也可以关注作者,查看历史文章并且关注最新动态,助你造成成为一名全栈工程师!