SSH原理

参考:https://github.com/wangdoc/ssh-tutorial
ssh是一个加密协议,通常用于远程登陆服务器为了避免明文传输导致的不安全。ssh分为服务端和客户端,被登录的服务器安装ssh服务端,要登陆的用户是ssh客户端。

SSH服务端

ssh服务端称为sshd,Ubuntu安装:sudo apt-get install openssh-server

sshd配置文件

sshd 的配置文件在/etc/ssh目录,主配置文件是sshd_config,此外还有一些安装时生成的密钥。

  • /etc/ssh/sshd_config:配置文件

注意,如果重装 sshd,上面这些密钥都会重新生成,导致客户端重新连接 ssh 服务器时,会跳出警告,拒绝连接。为了避免这种情况,可以在重装 sshd 时,先备份/etc/ssh目录,重装后再恢复这个目录。或者客户端运行:ssh-keygen -R hostname删除原来的公钥指纹,再次连接。

配置文件sshd_config的格式是,每个命令占据一行。每行都是配置项和对应的值,配置项的大小写不敏感,与值之间使用空格分隔。

Port 2034

上面的配置命令指定,配置项Port的值是2034Port写成port也可。

配置文件还有另一种格式,就是配置项与值之间有一个等号,等号前后的空格可选。

Port = 2034

配置文件里面,#开头的行表示注释。

# 这是一行注释

注意,注释只能放在一行的开头,不能放在一行的结尾。

Port 2034 # 此处不允许注释

上面的写法是错误的。

另外,空行等同于注释。

sshd 启动时会自动读取默认的配置文件。如果希望使用其他的配置文件,可以用 sshd 命令的-f参数指定。

$ sshd -f /usr/local/ssh/my_config

上面的命令指定 sshd 使用另一个配置文件my_config

修改配置文件以后,可以用 sshd 命令的-t(test)检查有没有语法错误。

$ sshd -t

配置文件修改以后,并不会自动生效,必须重新启动 sshd。

$ sudo systemctl restart sshd.service

SSH客户端

Ubuntu安装:sudo apt-get install openssh-client

基本用法

ssh username@hostname

如果是第一次连接,需要保存服务器公钥指纹(服务器公钥经过hash之后的值),以后每次连接需要验证这个指纹。所有的公钥指纹存在~/.ssh/known_hosts文件中。

SSH命令行配置

-c

-c参数指定加密算法。

$ ssh -c blowfish,3des server.example.com
# 或者
$ ssh -c blowfish -c 3des server.example.com

上面命令指定使用加密算法blowfish3des

-i

-i参数用于指定私钥,意为“identity_file”,默认值为~/.ssh/id_dsa(DSA 算法)和~/.ssh/id_rsa(RSA 算法)。注意,对应的公钥必须存放到服务器,详见《密钥登录》一章。

$ ssh -i my-key server.example.com

-p

-p参数指定 SSH 客户端连接的服务器端口。

$ ssh -p 2035 server.example.com

上面命令连接服务器的2035端口。

SSH密钥登陆

一种客户端免除输入密码的登陆方式。

密钥登陆过程

  1. 客户通过ssh-keygen生成自己的公钥密钥。
  2. 手动将客户的公钥放在服务器的指定位置
  3. 客户端向服务器发送SSH登录请求
  4. 服务端收到后明文发送一段随机数据给客户
  5. 客户收到之后用自己的私钥加密这段数据(签名)发送给服务器
  6. 服务器用客户端提供给自己的公钥解密,如果与原始数据一致,则允许登录。

ssh-keygen:生命密钥

通常使用参数t指定密钥的加密算法:ssh-keygen -t dsa

生成密钥以后,建议修改它们的权限,防止其他人读取。

$ chmod 600 ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa.pub

配置项

ssh-keygen的命令行配置项,主要有下面这些。

(1)-b

-b参数指定密钥的二进制位数。这个参数值越大,密钥就越不容易破解,但是加密解密的计算开销也会加大。

一般来说,-b至少应该是1024,更安全一些可以设为2048或者更高。

(2)-C

-C参数可以为密钥文件指定新的注释,格式为username@host

下面命令生成一个4096位 RSA 加密算法的密钥对,并且给出了用户名和主机名。

$ ssh-keygen -t rsa -b 4096 -C "your_email@domain.com"

(3)-f

-f参数指定生成的私钥文件。

$ ssh-keygen -t dsa -f mykey

上面命令会在当前目录生成私钥文件mykey和公钥文件mykey.pub

(4)-F

-F参数检查某个主机名是否在known_hosts文件里面。

$ ssh-keygen -F example.com

(5)-N

-N参数用于指定私钥的密码(passphrase)。

$ ssh-keygen -t dsa -N secretword

(6)-p

-p参数用于重新指定私钥的密码(passphrase)。它与-N的不同之处在于,新密码不在命令中指定,而是执行后再输入。ssh 先要求输入旧密码,然后要求输入两遍新密码。

(7)-R

-R参数将指定的主机公钥指纹移出known_hosts文件。

$ ssh-keygen -R example.com

(8)-t

-t参数用于指定生成密钥的加密算法,一般为dsarsa

上传公钥

客户端的公钥一般放在服务器的~/.ssh/authorized_keys,每个公钥占一行。权限是644。

posted @   hellozhangjz  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示