GitHub - 使用SSH进行连接

news2024/11/23 13:19:34

文章目录

  • 前言
  • 开发环境
  • 单个SSH密钥
    • 1.1. 生成SSH密钥
    • 1.2. 添加SSH密钥
    • 1.3. 测试SSH连接
    • 2.1. 简化密钥密码输入
  • 多个SSH密钥
    • 1.1. 生成/添加/测试SSH密钥
    • 2.1. 简化密钥密码输入
  • 无密码密钥
  • 补充内容
  • 最后


前言

有一个SSH密钥跟了我很多年,更换电脑也不曾更换它。它不需要额外输入密码就能用,我将它的公钥用在了诸多平台。虽然很方便,但是安全性差(指没有密码)和匿名性差(指同一公钥在不同平台可能被关联)。

于是,计划在保留已有SSH密钥的情况下,先新创建一个SSH密钥专门用于GitHub,并加上密码增加安全性,后续再逐步为其他平台创建。在实际操作过程中,遇到了一些问题并进行研究,在此记录一番,希望对你有所帮助。

注意,以下内容均是以GitHub使用SSH连接为例,分别讨论单个或多个SSH密钥的使用等问题。可能存在不完善或少许错误,欢迎留言评论补充或指正。

开发环境

  • MacOS: 14.3.1
  • SSH: OpenSSH_9.4p1

单个SSH密钥

如果不考虑匿名性,每台设备只维护单个SSH密钥用于各个平台是很轻松的,加上密码安全性也有一定的保障。GitHub使用SSH进行连接的步骤如下:

1.1. 生成SSH密钥

  1. 执行密钥创建命令
# 这是使用RSA算法生成
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 现在一般推荐使用安全性更高的Ed25519算法生成
ssh-keygen -t ed25519 -C "your_email@example.com"

your_email@example.com一般是GitHub上账号的电子邮件地址(来自GitHub官方文档的说法)。不过,这有个问题,一台设备上如果只管理一个SSH密钥,然后不同平台上的电子邮件地址又不一样,那该填什么?

先不管GitHub的说法,我们可以通过使用手册命令看看-C选项的含义:

man ssh-keygen

输出很长,这里只展示关于-C-c选项的内容(补充:-t选项是指定密钥类型):

...
-C comment
        Provides a new comment.
        
-c      Requests changing the comment in the private and public key
        files.  The program will prompt for the file containing the
        private keys, for the passphrase if the key has one, and for the
        new comment.
...

可见-C选项后面跟的只是注释,方便你标识这个密钥(标识用途或所有者等)。实测,直接填your_email@example.com也一切正常!而且这个注释是可以通过-c选项修改的,修改命令参考如下:

ssh-keygen -c -f ~/.ssh/id_ed25519

实测能修改成功,并且不需要更新已经添加到GitHub的公钥,注释信息并不会影响身份验证。所以,填什么请随意。

  1. 设置密钥存放路径
# RSA算法生成
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa):
# Ed25519算法生成
Enter file in which to save the key (/Users/xxx/.ssh/id_ed25519):

建议直接按Enter键使用它已经给出的默认文件路径,具体原因请看后面无密码密钥部分的内容。

  1. 设置密钥密码
Enter passphrase (empty for no passphrase):

如果不使用密码可以直接按Enter键,不过建议使用密码。生成密钥成功后,可以参考以下命令新增/修改/删除密码:

ssh-keygen -p -f ~/.ssh/id_ed25519
  1. 生成密钥成功
Your identification has been saved in /Users/xxx/.ssh/id_rsa(或id_ed25519)
Your public key has been saved in /Users/xxx/.ssh/id_rsa.pub(或id_ed25519.pub)
The key fingerprint is: xxx your_email@example.com
The key's randomart image is: xxx

参考文档:

  • GitHub - 生成新SSH密钥

1.2. 添加SSH密钥

打开SSH and GPG keys页面,如果没有登录请先登录。点击[New SSH key]按钮添加SSH密钥:

screenshot1

  • Title:给密钥设置描述性标签,可以用于区分设备。当某个设备的私钥泄漏时,方便快速找到该设备的SSH密钥并删除
  • Key type:密钥类型,分为Authentication Key(身份验证)和Signing Key(提交签名),使用默认的身份验证类型即可
  • Key:前面生成的公钥,可以通过以下命令将公钥复制到剪贴板,也可以找到公钥文件(.pub扩展名)用文本程序打开复制
# 复制RSA算法生成的密钥
pbcopy < ~/.ssh/id_rsa.pub
# 复制Ed25519算法生成的密钥
pbcopy < ~/.ssh/id_ed25519.pub

由于添加密钥是敏感操作,GitHub一般会让你再次验证身份,参考Sudo 模式。

参考文档:

  • GitHub - 向你的帐户添加新的SSH密钥

1.3. 测试SSH连接

通过执行以下命令测试:

ssh -T git@github.com

一般会得到这样的输出:

The authenticity of host 'github.com (20.205.243.166)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

其中SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU是服务器的公钥指纹,用于验证服务器的身份。GitHub的SSH密钥指纹:

SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s (RSA)
SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM (ECDSA)
SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU (Ed25519)

确认公钥匹配后,输入yes完成身份验证,会自动在~/.ssh/known_hosts文件中保存已验证服务器信息,后续无需再次验证,除非服务器信息有变化。

如果密钥有密码,需要输入密码完成连接测试。

参考文档:

  • GitHub - 向你的帐户添加新的SSH密钥

2.1. 简化密钥密码输入

如果你的SSH密钥有设置密码,那么你会发现每次使用(例如执行git pull命令)都需要输入一遍密码,相当麻烦。那么有什么办法可以解决这个问题呢?

这就不得不提到SSH代理,将密钥添加到代理,只需要输一次密码,后续无需重复输入密码。先在~/.ssh路径下创建config文件(如果该文件不存在):

touch ~/.ssh/config

然后往里面添加配置:

Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
  • AddKeysToAgent:将密钥加入代理
  • UseKeychain:将密码存储在钥匙串
  • IdentityFile:指定密钥文件路径

配置后,只需要输入一次密码,密码会自动保存到钥匙串,打开钥匙串应用搜索SSH关键词可以找到存储记录。通过以下命令可以查看已经添加到SSH代理中的密钥:

ssh-add -l

当重启电脑后(也可以通过killall ssh-agent命令终止代理,在需要时会自动重启)马上查看SSH代理中的密钥,你会发现没有加载任何密钥:

The agent has no identities.

这时使用SSH连接(例如执行git pull命令),会自动添加密钥,也无需再输入密码。

关于配置中的Host,这里引出另一个问题,现在只维护单个密钥用于多个平台,按前面的配置,只有连接GitHub时能简化密码输入,其他平台还是每次都需要输入密码。

这很好解决,在config文件中参考前面的配置修改Host给其他平台也增加配置即可。需要注意一点,有些平台的Host可能类似这样的git.github.com,这时你要么完全按照这个配置,要么使用通配符*.github.com

如果平台多了,配置也挺麻烦的,本来只维护单个密钥就为了省事,那还有没有更省事的方法呢?肯定是有的,参考如下配置:

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519

参考文档:

  • GitHub - 将SSH密钥添加到ssh-agent

多个SSH密钥

1.1. 生成/添加/测试SSH密钥

参考前面单个SSH密钥的生成/添加/测试,除了设置密钥存放路径时需要重新命名区分已有的密钥文件外,操作基本一样。

我一般按照这个格式id_aaa.bbb命名,aaa是密钥类型(例如ed25519),bbb是平台标识(例如github)。按自己喜好命名,方便自己标识就行。

2.1. 简化密钥密码输入

参考前面单个SSH密钥的简化密码输入,可以针对不同平台配置不同的密钥文件:

Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519.github
  
Host xxx.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa.xxx

或者更简单点(不过都维护多个密钥了,应该很少这么做了吧):

Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
  
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_rsa

如果按照上方示例中的配置,会根据先后顺序匹配。例如id_ed25519密钥会被优先匹配,只有当匹配失败或密码错误,才会继续往下匹配。

无密码密钥

前面着重讲设有密码的密钥,那如果密钥不设置密码还需要配置吗?

这里先引出一个默认密钥文件的说法,默认密钥文件指使用默认名称命名并放在默认路径下的密钥。默认路径默认名称分别指:

  • 默认路径~/.ssh
  • 默认名称id_dsa | id_ecdsa | id_ecdsa_sk | id_ed25519 | id_ed25519_sk | id_rsa

进而引出:

  • 对于单个无密码密钥,只要属于默认密钥文件SSH会自动添加,无需再额外配置
  • 对于多个无密码密钥,不属于默认密钥文件的需要在config文件中配置,参考配置如下:
Host github.com
  IdentityFile ~/.ssh/id_ed25519.github

或许你会疑问,默认密钥文件的说法是怎么来的?

在已有密钥的情况下创建新密钥时,我发现自定义命名的密钥无法直接使用,同时将密钥名称改为默认名称后又可以了,所以合理猜测存在一些默认密钥文件会被SSH自动添加(无论密钥是否有密码,有密码的密钥不配置也能正常使用,只是需要输入密码)。

关于猜测的具体验证过程请看续篇:GitHub - 使用SSH进行连接(续)。

补充内容

除了通过配置config文件简化密码输入,还可以通过以下方法。

~/.bash_profile~/.zshrc文件末尾加上:

if ! ssh-add -l | grep -q "your_email@example.com"; then
    ssh-add --apple-use-keychain ~/.ssh/id_ed25519.github
fi

其中your_email@example.com是创建密钥时的注释(参考前面的密钥创建),~/.ssh/id_ed25519.github是密钥文件路径,请根据实际情况替换。

追加内容保存后,重新打开终端或用source命令使其生效。根据提示,首次输入密码后,后续无需再输入密码。

这个原理很简单,每当打开终端时,首先通过ssh-add -l命令获取已经添加到SSH代理中的密钥信息,然后根据密钥信息搜索是否包含特定注释信息,以此判断密钥是否已经被添加到SSH代理中,最后如果没添加则通过ssh-add --apple-use-keychain命令添加。

--apple-use-keychain的作用是将首次输入的密码存储到钥匙串中。补充一点,以前是用-K,现在已经被弃用。

注意,这个方法有个缺点,如果重启电脑后你没先打开终端触发自动加载密钥,那就不会加载。

例如重启电脑后,直接用Sourcetree软件执行Git相关操作,会报错。不过,Android Studio是例外,猜测可能是因为它启动时也启动了shell进程,触发了密钥加载。

简单验证一下猜测:删除钥匙串中保存的密钥密码,并且通过killall ssh-agent命令终止代理(清除已添加的密钥),重新启动Android Studio,随意打开一个项目,结果卡住了一会儿,还弹了警告:

screenshot2

Learn more按钮指向Shell Environment Loading文章。

同时内置终端卡在密钥密码输入。结合Learn more按钮指向的文章可知,Android Studio果然启动了shell进程,当遇到首次加载密钥需要输入密码时,会因为等待密码输入而卡住,直到等待超时。

最后

如果这篇文章对你有所帮助,点赞👍收藏🌟支持一下吧,谢谢~


本篇文章由@crasowas发布于CSDN。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云轻量2核2G3M云服务器优惠价格61元一年,限制200GB月流量

腾讯云轻量2核2G3M云服务器优惠价格61元一年&#xff0c;配置为轻量2核2G、3M带宽、200GB月流量、40GB SSD盘&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云轻量2核2G云服务器优惠价格 腾讯云&#xff1a;轻量应用服务器100%CPU性能…

QT初识(1)

QT初识 桌面开发什么是QT下载QT安装好之后的工具AssisantDesignerQT Creator 创建一个简单的项目 我们今天来认识一下QT。 桌面开发 在了解QT&#xff0c;我们得了解一下桌面开发&#xff1a; 桌面开发指的是编写和构建在个人计算机或其他桌面操作系统&#xff08;如Windows、…

论文笔记 - :MonoLSS: Learnable Sample Selection For Monocular 3D Detection

论文笔记✍MonoLSS: Learnable Sample Selection For Monocular 3D Detection &#x1f4dc; Abstract &#x1f528; 主流做法限制 &#xff1a; 以前的工作以启发式的方式使用特征来学习 3D 属性&#xff0c;没有考虑到不适当的特征可能会产生不利影响。 &#x1f528; 本…

全面概述Gitee和GitHub生成/添加SSH公钥

前言 现如今将代码开源已经成为软件开发行业的一种趋势&#xff0c;而现在比较有名的代码托管平台有GItHub、Gitee、Gitlab等相关平台。而我们在使用代码托管平台最为常见的就是如何将自己本地的代码推送到远程托管平台中的仓库中&#xff0c;现如今各大托管平台基本上都提供了…

鸿蒙手机cordova-plugin-camera不能拍照和图片不显示问题

鸿蒙手机cordova-plugin-camera不能拍照和图片不显示问题 一、运行环境 1、硬件 手机型号&#xff1a;NOVA 7 系统&#xff1a;HarmonyOS版本 4.0.0 2、软件 android SDK platforms&#xff1a;14.0(API Level 34)、13.0&#xff08;API Level 33&#xff09; SDK Build-T…

jvm类加载机制概述

、什么是jvm的类加载机制 类加载机制是指我们将类的字节码文件所包含的数据读入内存&#xff0c;同时我们会生成数据的访问入口的一种 特殊机制。那么我们可以得知&#xff0c;类加载的最终产品是数据访问入口。 加载类文件&#xff08;即.class文件&#xff09;的方式有以下几…

一些基本类上实用的注解及例子

文章目录 一些基本类上实用的注解及例子一、Data二、Accessors三、AllArgsConstructor四、NoArgsConstructor五、EqualsAndHashCode六、后面在补充&#xff01;先这样吧&#xff0c;哈哈&#xff01;总结 一些基本类上实用的注解及例子 一、Data Data 注解是一个组合注解&…

Django源码之路由的本质(上)——逐步剖析底层执行流程

目录 1. 前言 2. 路由定义 3. 路由定义整体源码分析 3.1 partial实现path函数调用 3.2 图解_path函数 3.3 最终 4.URLPattern和Pattern的简单解析 5. 小结 1. 前言 在学习Django框架的时候&#xff0c;我们大多时候都只会使用如何去开发项目&#xff0c;对其实现流程并…

linux 软中断入门

在 linux 中&#xff0c;任务执行的载体有很多&#xff0c;包括线程&#xff0c;中断&#xff0c;软中断&#xff0c;tasklet&#xff0c;定时器等。但是从本质上来划分的话&#xff0c;任务执行的载体只有两个&#xff1a;线程和中断。软中断和 tasklet 的执行可能在中断中&am…

云服务器8核32G配置报价大全,腾讯云、阿里云和京东云

8核32G云服务器租用优惠价格表&#xff0c;云服务器吧yunfuwuqiba.com整理阿里云8核32G服务器、腾讯云8核32G和京东云8C32G云主机配置报价&#xff0c;腾讯云和京东云是轻量应用服务器&#xff0c;阿里云是云服务器ECS&#xff1a; 阿里云8核32G服务器 阿里云8核32G服务器价格…

9.动态规划——2.最大序列和

例题——最大序列和 找状态 思路一&#xff08;&#xff09; 定义一个状态 d p [ i ] dp[i] dp[i]&#xff0c;计为前i个数构成子序列和的最大值 此法状态转移比较困难&#xff0c;即若 d p [ i ] dp[i] dp[i]与 d p [ i − 1 ] dp[i-1] dp[i−1]没有明确的关系&#xff0c;有…

获取电商数据的几种方法分享

在数字化时代&#xff0c;电商数据已经成为企业决策的重要依据。无论是市场趋势的洞察、用户行为的分析&#xff0c;还是产品优化和营销策略的制定&#xff0c;都离不开电商数据的支持。本文将分享几种获取电商数据的有效方法&#xff0c;力求在干货满满的同时&#xff0c;也不…

PyCharm中出现Microsoft Defender配置建议

原因 Windows安全中心的病毒和威胁防护会自动扫描电脑中的文件夹&#xff0c;我们的项目文件夹和IDE文件夹也会被扫描&#xff0c;而PyCharm认为这会降低IDE性能。 解决方法 直接点击提示框里的自动。 或是手动给扫描添加排除项&#xff0c;步骤如下&#xff1a; 1、先打开…

Sui原生功能如何改变链上游戏体验

从zkLogin到可编程交易区块&#xff08;PTB&#xff09;&#xff0c;Sui的原生功能为游戏开发人员提供了工具&#xff0c;最终利用了Web3的力量&#xff0c;给玩家带来了新的体验和参与度。之前的区块链在支持链上游戏方面存在技术上的局限&#xff0c;但是Sui提供了开发人员所…

受益于边缘计算的三个关键应用

边缘计算和 5G 网络正在改变物联网&#xff0c;增强跨多个领域的广泛应用的功能&#xff0c;并催生大量新兴应用。我们通过研究三个突出的用例来说明边缘计算的强大功能。 工业4.0智能工厂 工业 4.0 为制造商提供了基于灵活的工业环境提高生产力和盈利能力的愿景&#xff0c;…

AR-Net网络(图像篡改检测)

AR-Net网络 摘要AbstractAR-Net1. 文献摘要2. 研究背景3. 创新点4. AR-Net 网络架构5. 实验6. 结论总结 摘要 AR-Net使用自适应注意力机制来融合位置和通道维度的特征&#xff0c;使网络能够充分利用不同维度的被篡改特征&#xff0c;此外&#xff0c;AR-Net 改进了预测掩模&a…

牛客NC92 最长公共子序列(二)【中等 动态规划 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/6d29638c85bb4ffd80c020fe244baf11 思路 https://blog.csdn.net/qq_36544411/article/details/120021203 思路 动态规划法&#xff0c; 我们以dp[i][j]表示在s1中以第i个元素结尾&#xff0c;s2中以第j个元素结…

【JavaSE】初识线程,线程与进程的区别

文章目录 ✍线程是什么&#xff1f;✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么&#xff1f; ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

常见微服务的组件?

注册中心&#xff1a;就是一个服务注册的地方&#xff0c;我们可以把拆分的服务注册到注册中心&#xff0c;这样注册中心就能管理这些服务&#xff0c;服务之间的调用就会很方便&#xff0c;通过服务名就能相互调用。 负载均衡&#xff1a;被调用放的负载均衡&#xff0c;比如…

人工智能产业应用--具身智能

五、下一个浪潮 (一) 跳出缸中脑——虚实结合 在探索人工智能的边界时&#xff0c;“跳出缸中脑——虚实结合”这一概念提出了一个引人深思的视角&#xff0c;尤其是在具身智能的领域。具身智能是一种思想&#xff0c;强调智能体通过与其环境的直接物理互动来实现智能行为。然…