云服务器配置SSH及免密登录

knoci 发布于 2025-02-07 93 次阅读


云服务器配置SSH及免密登录

配置SSH

新买了一台云服务器,但是不知道怎么配置SSH?下面是萝莉都能看得懂的教程!

​ 一般在云服务器场上购买完成后会自带SSH,我们买服务器的时候设置了的密码就兼为SSH密码,如果服务器没有SSH的话,通过命令下载即可。这里下载的OpenSSH,是SSH的开源实现,分为Client端和Server端,如果想要SSH远程登录必须要有Server端

# Ubuntu&Debian
sudo apt-get install openssh-server
# CentOS
yum install openssh-server -y

​ 安装完了之后,要开启远程登录和设置端口,这里使用vim打开config,没有vim用其他的也行。

vim /etc/ssh/sshd_config

​ 把 PermitRootLogin 设置为yes

Port是SSH的端口,默认22,你要是觉得不安全可以改,不过一般情况下默认就行。

因为我的服务器,自带了SSH,只要在Win端安装SSH连接客户端就行了,这里我用的是WindTerm,用什么无所谓,选自己喜欢的就行。

​ 链接主机要输入 用户名@公网IP:端口

​ 也可以用cmd链接,但是要确保你的电脑安装了OpenSSH的Client端

​ 输入密码就连接成功!十分简单呢,萝莉都能学会!


免密连接

​ 首先,我们要在服务器上生成密钥对,使用指令:

ssh-keygen -t rsa

​ 执行上面的命令时,我们直接按三次回车,之后会在用户的根目录下生成一个 .ssh 的文件夹,我们进入该文件夹下面并查看有哪些内容。

cd /root/.ssh/
ls

  • authorized_keys 存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥。
  • id_rsa 私钥,千万不可泄露
  • id_rsa.pub 公钥

​ 然后我们在电脑上也执行ssh-keygen,指令和上面一样,之后在C:Users<你电脑的用户名>.ssh就可以看到生成了密钥和公钥。

image-20241130121514207

免密登录本质上就是把电脑端的公钥上传到服务器端,有两种方法都可以实现免密登录:

方法一 使用ssh-copy-id指令:

​ 如果是Linux系统,可以运行下面代码把公钥上传服务器,简单无脑。

ssh-copy-id 用户名@公网ip

​ 但是如果你是Windos的话,可没有这个指令

image-20241130122324765

​ 我们用管理员打开Windows PowerShell,复制下面代码运行,就可以用ssh-copy-id了,本质上是写了一个shell脚本,实现ssh-copy-id的功能

function ssh-copy-id([string]$userAtMachine, $args){   
    $publicKey = "$ENV:USERPROFILE" + "/.ssh/id_rsa.pub"
    if (!(Test-Path "$publicKey")){
        Write-Error "ERROR: failed to open ID file '$publicKey': No such file"            
    }
    else {
        & cat "$publicKey" | ssh $args $userAtMachine "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys || exit 1"      
    }
}

​ 这里弹出countinue connecting时输入yes,之后输入SSH的密码

image-20241130122904142

​ 之后我们打开服务器的authorized_keys就可以看到我们的公钥被上传了

image-20241130123005385

方法二 手动复制粘贴

​ 你也可以使用最原始的CV的大发,打开电脑上的id_rsa.pub,复制,然后粘贴到服务器的authorized_keys上即可

image-20241205220902694

​ 之后只要选择私钥文件点击继续就可以连接,密码都不用输~

image-20241205220548137


SSH的原理

参考SSH协议握手核心过程_哔哩哔哩_bilibili

​ 在双方进行完tcp连接后,会进行 协议版本Protocol的确定,就是商量用的SSH版本和OpenSSH,其中SSH1.99表示支持SSH1和SSH2,之后密钥交换初始化,协商使用的加密算法等信息

image-20241205212912067

​ 在这之后,服务端和客户端都会生成临时的密钥对,然后相互交换公钥,这里用临时的密钥使用后会销毁,这样即使被截获了也难堪大用

用自己的密钥对和交换到的对方公钥(三把钥),经过加密算法生成共享安全密钥,如下图,虽然客户端和服务器的三把钥匙是不一样的,但是加密算法保证了双方生成的共享安全密钥是一样的

image-20241205213427692

​ 接下来有意思的部分来了,我们怎么保证通话对象有没有被篡改呢?其实核心就在于怎么确认客户端和服务器生成了一样的共享安全密钥,毕竟有可能客户端或服务器的临时公钥在交换时被黑客篡改了,导致双方生成的共享安全密钥不一致!

​ 那么怎么确认双方生成的密钥一致呢,难道直接发送给对方来确认?这样式万万不可的,密钥之所以“密”,就是永远不能给别人看!

​ 于是,我们服务器端用共享安全密钥和其他信息,通过算法生成一个交换哈希值,之后用一个host密钥对加密交换哈希值后,把host公钥和加密后交换哈希值发给客户端。这里host密钥对是专门用来加密交换哈希值的,防止篡改

image-20241205214558039

​ 客户端收到后,会用host公钥解密传来的加密后交换哈希值,得到服务端的交换哈希值,然后用自己的共享安全密钥和其他信息,通过算法生成一个交换哈希值,如果双方的共享安全密钥一致,理论上生成的交换哈希值也是一致的。若交换哈希值不一致,就是双方生成的的密钥不一致,有一方被篡改了!


结尾

​ 多年以后,面对无数次SSH拒绝连接,那位小白将会回想起初次连接 SSH 的那个阳光明媚的午后。