专栏首页全栈者ssh免密登录原理与实现

ssh免密登录原理与实现

作为开发者,所开发的每一个应用在成型后都需要部署,虽然我们使用着各式各样的部署工具,但是其背后最本质的东西完全一样,便是如何与服务器交互,而交互的第一步便涉及到登录。

一. 认识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. 两种方式简单比较

从原理层面上就可看出,第一种验证方式相比于第二种的步骤稍微简单一些,即代表第一种在连接时更快一些。但是第二种方式则更加安全一些,因为第一种方式并不能完全保证你所连接的机器就是你想连接的机器,存在“中间人攻击”的风险。

如上内容均为自己总结,难免会有错误或者认识偏差,如有问题,希望大家留言指正,以免误人。有什么问题请留言,会尽力回答之。

如果对你有帮助不要忘了分享给你的朋友或者点击右下方的“在看”哦!也可以关注作者,查看历史文章并且关注最新动态,助你造成成为一名全栈工程师!

本文分享自微信公众号 - 全栈者(fullStackEngineer),作者:TingRongGao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 揭秘前端文件上传原理(二)

    “ 上一篇文章讲到了以Form表单,将文件数据编码为特定的类型,来作为前端文件上传的载体,这一篇再来看看,如果不使用Form表单,不以FormData去提交数据...

    用户1462769
  • 前端进阶必备 — 手撕排序算法

    算法(Algorithm) 代表着用系统的方法描述解决问题的策略机制,可以通过一定规范的 输入,在有限时间内获得所需要的 输出。

    用户1462769
  • 一步一步解析Axios源码,从入门到原理

    一个基于 Promise 来管理 http 请求的简洁、易用且高效的代码封装库。通俗一点来讲,它是一个前端替代Ajax的一个东西,可以使用它发起http请求接口...

    用户1462769
  • 《Redis设计与实现》读书笔记(三十七) ——Redis 慢查询日志实现

    《Redis设计与实现》读书笔记(三十七) ——Redis 慢查询日志实现 (原创内容,转载请注明来源,谢谢) 一、基本功能 通过monitor命令,redis...

    用户1327360
  • 如何在 CentOS 7 上配置 MySQL 主从复制

    MySQL replication 是一个进程,它允许你自动从一个数据库服务器拷贝数据到另外一个或者更多的服务器。

    雪梦科技
  • 速读原著-TCP/IP(Telnet举例)

    在这里我们将介绍在三种不同的操作方式下 Te l n e t选项协商的情况。这些方式包括:单字符方式、实行方式和准行方式。同样我们还将讨论当用户在服务器端按了中...

    cwl_java
  • IMAP和POP3区别

    POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到...

    py3study
  • 浅谈服务器海量运营

    "鹅厂网事"由深圳市腾讯计算机系统有限公司技术工程事业群网络平台部运营,我们希望与业界各位志同道合的伙伴交流切磋最新的网络、服务器行业动态信息,同时分享腾讯在网...

    鹅厂网事
  • gitee配置

    在用户主目录下找到.ssh文件夹(隐藏文件) 新建config文件,添加如下内容

  • Servlet技术2

    注意: 键名其实就是前端页面中的表单标签的name属性的值或者前端页面其他方式提交数据的键的名字。 如果请求中没有对应的请求数据,则返回null.

    时间静止不是简史

扫码关注云+社区

领取腾讯云代金券