如何使用 SSH 连接 Github 和服务器
本文介绍了如何使用 SSH
连接 Github
和免密登录服务器作为备忘笔记,主要在新建虚拟机或重装云服务器系统时使用。
使用 SSH 连接 Github
检查现有 SSH 密钥
打开终端,输入 ls -al ~/.ssh
以查看是否存在现有的 SSH
密钥。
1 | ls -al ~/.ssh |
检查目录列表以查看是否已经有 SSH
公钥。 默认情况下,GitHub
的一个支持的公钥的文件名是以下之一。
id_rsa.pub
id_ecdsa.pub
id_ed25519.pub
生成 SSH 密钥
如果没有密钥,就需要生成新的 SSH
密钥;如果已有,跳到上传已有密钥环节。
打开终端,粘贴下面的文本(替换为你的 GitHub
电子邮件地址),这将以提供的电子邮件地址为标签创建新 SSH
密钥。
一直 yes
确定选择默认即可。
1 | ssh-keygen -t ed25519 -C "[email protected]" |
上传 SSH 密钥
将 SSH
公钥复制到剪贴板,在 Github
上的 Settings -> Access -> SSH and GPG keys -> New SSH key
,粘贴即可。
1 | cat ~/.ssh/id_ed25519.pub |
配置 Git
1 | git config --global user.name "your_username" |
使用 SSH 免密登录服务器
使用现成的密钥,将 ~/.ssh/id_ed25519.pub
的内容追加到服务端的 ~/.ssh/authorized_keys
中,使用 ssh user@host
成功免密登录。这样一来,远程连接服务器或者使用 VScode Remote Explorer
时,不用每次输入密码了。
VScode Remote Explorer 无法连接
在更新 VMware Workstation 17 Pro
后,发现虚拟机的 IP
从 192.168.46.135
重置 为 192.168.46.128
,即使更新配置文件 C:\Users\moralok\.ssh\config
中的 IP
VScode Remote Explorer
仍然无法连接,但是通过 Xshell
使用账号密码可以登录。查看报错信息发现 known_hosts
中 192.168.46.128
对应的 ECDSA key
有问题,应该记录的是之前占用该 IP
的虚拟机的 ECDSA key
,删除该行后重新连接成功。
1 | [18:09:59.973] > @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
SSH 的原理
关于 SSH
使用 SSH
协议可以连接远程服务器和服务并向它们验证,而无需在每次访问时都提供用户名和密码,Github
还可以使用 SSH
密钥对提交进行签名。
公钥和私钥
SSH
的使用(非对称加密)需要生成公钥 public key
和私钥 private key
。常用的算法有 rsa
、ecdsa
和 ed25519
,相对应的公钥默认文件名即 id_XXX.pub
。ed25519
的安全性介于 rsa 2048
和 rsa 4096
之间,但性能却提升数十倍。
在生成密钥时,会要求你 Enter passphrase (empty for no passphrase):
,可以输入一个口令保护私钥的使用。不为空的情况下,正常使用是需要输入这个口令的,很多人认为麻烦,因此留空。
公钥的权限必须是 644
,私钥的权限必须是 600
,否则 SSH
认为其不可靠。
私钥是要安全保管在客户端不能泄露的,公钥则要提供给远程服务器或服务。服务端的 ~/.ssh/authorized_keys
里面存储着可以登录的客户端的公钥。我们将公钥粘贴到 Github
的过程就是对应于此。
1 | ssh-keygen -t rsa -b 4096 -f my_id -C "[email protected]" |
-t
表示算法,如rsa
。-b
表示rsa
密钥长度,默认2048 bit
,ed25519
不需要指定。-f
表示文件名。-C
表示在公钥文件中添加注释,可修改
SSH 公钥登录过程
Client
将自己的公钥存放到服务端,追加到authorized_keys
文件。Server
收到Client
的连接请求后,会在authorized_keys
文件中匹配到Client
传过来的公钥,并生成随机数R
,用公钥对随机数加密得到pubKey(R)
。Client
收到后通过私钥解密得到随机数R
,然后对随机数R
和本次会话的sessionKey
使用MD5
生成摘要Digest1
,发送给服务端。Server
会对随机数R
和会话的sessionKey
同样使用MD5
生成摘要Digest2
,对比相同即完成认证过程。
避免中间人攻击
SSH
通过口令确认避免中间人攻击,如果用户第一次登录 Server
,系统会提示:
1 | ssh -T [email protected] |
Server
需要在其网站上公示其公钥的指纹,Github
的公钥指纹在这里。
确认匹配后,客户端会在 ~/.ssh/known_hosts
中记录,下次登录不再警告。
参考链接
使用 SSH 进行连接 Github
Git 多台电脑共用SSH Key
SSH协议登录过程详解
GitHub 的 SSH 密钥指纹
使用 Ed25519 算法生成你的 SSH 密钥