PSK's blog

PSK的学习研究经验分享站

SSH密钥登录和使用私钥在常见开发软件远程访问服务器方法简述

1 SSH公私钥的生成方法

1
ssh-keygen

如果需要生成特定类型的公私钥可以加个-t参数,例如-t rsa -b 4096(RSA4096)或者-t ed25519(ED25519)。从简直接按默认生成就行。

之后的操作就是回车和填入必要信息。从简可以不填入passphase密码,后续操作会方便一些(当然安全性没有加上这个好)。后续博文将会默认你没有设置passphase(输入passphase步骤和确认passphase步骤直接回车过去)。

当输出类似下列语句和一张randomart字符图片之后,公私钥生成完成。依照下面的提示信息找到你生成的公钥的位置,准备好留作后面的准备。

1
2
3
Your identification has been saved in /home/<your_name>/.ssh/id_rsa.

Your public key has been saved in /home/<your_name>/.ssh/id_rsa.pub.

注意保护好自己的私钥,不要乱发id_rsaid_ed25519之类的文件给别人。不过公钥*.pub文件就没有类似私钥的严格保密要求。这个是可以存到服务器作为你的身份凭证的。

2 SSH 免密登录

服务器在密钥登录的过程中,不需要知道你的私钥的内容,只需要你的公钥内容即可(基础的公私钥理论)。SSH 免密登录的逻辑大致如下:

  • 客户端向服务器发布密钥登录请求
  • 服务器向客户端发送随机字符串
  • 客户端用私钥加密字符串发给服务器
  • 服务器用公钥解密字符串,与先前随机字符串校验

也就是说,服务器端只需要知道公钥即可以进行密钥登录(免密登录)。以Linux服务器为例,服务器存储已知公钥的文件为~/.ssh/authorized_keys,只要私钥对应的公钥被记录在这个文件中之后,使用对应的私钥就可以免密登录ssh。

linux提供了一个比较方便的方式上传公钥ssh-copy-id。使用方法范例如下所示:

1
ssh-copy-id -i /path/to/id.pub username@hostip

在一个禁止密码登录的服务器上,第一个公钥需要让服务器管理员帮忙上传到你的家目录的~/.ssh文件夹中。你需要给你的管理员提供公钥文件(这个文件在上一节给出了位置),让管理员把公钥放到你的家目录的~/.ssh/authorized_keys里面。不过,后续的公钥可以自行上传。

假设A机器已经配置好了密钥(免密)登录,现在需要给B机器配置密钥(免密)登录,公钥上传的方法如下:

  • 在B机器上运行第1节所述内容生成公私钥
  • 将B机器上生成的公钥下载/转移到A机器上
  • 在A机器上运行ssh-copy-id -i /path/to/B_id.pub username@hostip(注意修改命令)

3 常见开发软件使用ssh公私钥方式登录示例

Visual Studio Code

参考文献:https://blog.songjiahao.com/archives/262

理论上只要完成了ssh免密登录,vscode就可以直接免密访问服务器。他们都使用用户目录下.ssh文件夹内的私钥尝试进行登录。

如果登录失败,可以试试:侧边栏SSH连接页面 -> 左上小齿轮 -> 选择配置文件打开配置文件。然后,在服务器的Host的子项目里面添加一行,注意保持缩进。

1
IdentityFile /path/to/id_file

Xshell

参考文献:https://blog.csdn.net/weixin_41843699/article/details/90680306

在身份验证窗口,选择Public Key -> 用户密钥 -> 浏览 -> 选择第1节中生成的私钥。如未设置密码则密码部分留空。

Jetbrains Gateway

SSH Connections(或左侧Connections栏下SSH)-> New Connection -> 填好Username、Host等信息 -> 选择Specify private key -> 选择第1节中生成的私钥即可。

4 常见问题

权限问题

Linux下,私钥文件应保持600的权限要求。而在windows中,具体权限也有相应要求,详见这篇博文

先删除原所属用户:

右键私钥文件,属性 - 安全 - 高级 - 禁用继承 - 应用

再添加当前Windows用户:

右键id_rsa文件,属性 - 安全 - 高级 - 添加 - 添加主体 - 立即查找 - 选择当前Windows用户 - 确认 - 应用

本篇博文将会持续更新相关问题。