【设置ssh免密不起作用?彻底搞懂密钥】vscode在remote SSH免密远程登录

1.什么是密钥

SSH 默认采用密码登录,这种方法有很多缺点,简单的密码不安全,复杂的密码不容易记忆,每次手动输入也很麻烦。密钥登录是更好的解决方案。

密钥(key)是一个非常大的数字,通过加密算法得到。对称加密只需要一个密钥,非对称加密需要两个密钥成对使用,分为公钥(public key)和私钥(private key)。

1.1公钥

公钥----添加到服务器的某个账户上,~/.ssh目录下(如该目录不存在,则新建一个),并命名为authorized_keys(如该文件已经存在,则把公钥的内容放在原authorized_keys内容的末尾,如果authorized_keys文件的末尾不是一个换行符,会导致新的公钥添加到前一个公钥的末尾,两个公钥连在一起,使得它们都无法生效。所以,如果authorized_keys文件已经存在,使用ssh-copy-id命令之前,务必保证authorized_keys文件的末尾是换行符(假设该文件已经存在)。

1.2 私钥

私钥----必须私密保存,不能泄漏。

SSH 密钥登录采用的是非对称加密,每个用户通过自己的密钥登录。其中,私钥必须私密保存,不能泄漏;公钥则是公开的,可以对外发送。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。
如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。

1.3 密钥SSH登录过程

  1. 手动将客户端的公钥放入远程服务器的指定位置。
  2. 客户端向服务器发起 SSH 登录的请求。
  3. 服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
  4. 客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
  5. 服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。

参考文章

2.什么是SSH

2.1 认识SSH

SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH。

2.2 SSH的安全机制

  • 基于口令的安全验证

只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人攻击”这种方式的攻击。

  • 基于密钥的安全验证

你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥在本地解密再把它发送给服务器完成登录。与第一种级别相比,第二种级别不仅加密所有传输的数据,也不需要在网络上传送口令,因此安全性更高,可以有效防止中间人攻击。

参考文章

3.设置密钥免密登录

3.1 本地生成公钥和私钥

在本地终端使用ssh-keygen命令创建的密钥,会在本地~/.ssh/的目录内生成两个文件id_rsa和id_rsa.pub,一个是私钥,另一个是公钥。

ssh-keygen命令 用于为“ssh”生成、管理和转换认证密钥,它支持RSA和DSA两种认证密钥。ssh密钥默认保留在 ~/.ssh 目录中。如果没有 ~/.ssh 目录,ssh-keygen命令会使用正确的权限创建一个。

ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa-remote-ssh

执行完命令,一直按回车即可生成密钥,执行过程中会显示保存密钥的路径。

参考文章

参数说明
-t 指定要创建的类型
-b 密钥长度
-f 指定用来保存密钥的文件名
id_rsa-remote-ssh 名字可以随意定义

在这里插入图片描述

cd到.ssh文件中就可以看到密钥文件了

在这里插入图片描述

config是vscode 连接远程主机的配置文件
id_rsa 就是私钥文件
id_rsa.pub 就是公钥文件
known_host 就是记录你曾经远程连接过的机器信息文件

在这里插入图片描述

3.2 远程主机配置公钥

先登录你的远端服务器,然后将刚才生成本机公钥复制到远程服务器~/.ssh/authorized_keys中,authorized_keys文件不存在则创建。这样就建立了本地主机和远端主机的双端验证通道,就可以跳过密码了。

你可以直接把id_rsa.pub文件直接复制到~/.ssh/目录下,然后把文件名改为authorized_keys。也可以在~/.ssh/目录下新建authorized_keys文件,然后把id_rsa.pub中的内容复制到authorized_keys中。两种方案都可以,个人推荐第一种,可以避免复制内容的时候搞错。

⚠️ 3.3 设置ssh路径下的权限(重要!)

⚠️ 远程服务器~/.ssh/authorized_keys文件设置好后,一定要修改路径下的权限,否则ssh密钥认证会失效!!

由于 authorized_keys这个文件我们自己创建的,而 ssh 处于安全性考虑,对.ssh目录下的文件权限内容有着严格的权限要求,如果权限设置不对,在配对秘钥的时候会无法打开authorized_keys文件从而导致秘钥配对失败。而ssh此时没有放弃连接,依然会尝试询问用户密码。最终产生的结果就是用户配置了公钥却仍然需要输入密码的问题。很多教程都没有说明这一点,导致我也是费了很大功夫才找到问题。

参考文章

  • 设置用户权限/home/qwa(改成自己的用户)
chmod 700 /home/userName
  • 设置.ssh文件权限~/.ssh
chmod 700 ~/.ssh
  • 设置authorized_keys文件权限
chmod 600 ~/.ssh/authorized_keys

在这里插入图片描述

配置完可以ls -l 命令查看文件的权限 700 对应 dxrw------- (d代表目录) 600对应 -rw--------

设置完权限,还需要更改一些ssh的服务配置信息,切换到root用户打开
文件/etc/ssh/sshd_config

su -
vim /etc/ssh/sshd_config 

把 PubkeyAuthentication 前的 # 号去掉,这样公钥验证才生效。

  • 重启远程服务器的ssh服务
systemctl restart sshd.service 

4. vscode的remote插件的配置

  • 安装插件
    在这里插入图片描述
  • 打开remote的config配置
    在这里插入图片描述
  • 配置主机(ip),用户名(user),私钥的位置
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host root
    HostName 110.40.xxx.xxx
    User root
    IdentityFile /Users/wenanqin/.ssh/id_rsa-remote-ssh

Host  qwa
    HostName 110.40.xxx.xxx
    User qwa
    IdentityFile /Users/wenanqin/.ssh/id_rsa-remote-ssh //本机私钥路径

在这里插入图片描述

  • 设置完保存就可以用vscode远程登录服务器了,再新建一个终端就可以完全代替xshell了
    在这里插入图片描述
    在这里插入图片描述

如过文章对你有帮助,可以点一个免费的赞,虽然写文章只是为了记录和分享,但是能得到一些正反馈也是对博主莫大的鼓励~

猜你喜欢

转载自blog.csdn.net/weixin_42907822/article/details/125237307