设置ssh免密不起作用?彻底搞懂密钥vscode在remote SSH免密远程登录
Posted 几叶知期
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设置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登录过程
- 手动将客户端的公钥放入远程服务器的指定位置。
- 客户端向服务器发起 SSH 登录的请求。
- 服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
- 客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
- 服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。
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了
如过文章对你有帮助,可以点一个免费的赞,虽然写文章只是为了记录和分享,但是能得到一些正反馈也是对博主莫大的鼓励~
以上是关于设置ssh免密不起作用?彻底搞懂密钥vscode在remote SSH免密远程登录的主要内容,如果未能解决你的问题,请参考以下文章
设置ssh免密不起作用?彻底搞懂密钥vscode在remote SSH免密远程登录
VSCode 配置 Remote-SSH 远程开发并配置免密登录