简介

忽然发现用公钥无法把代码推到gitee,原来是我使用的OpenSSH太新,已经废弃掉了ssh-rsa签名算法,而gitee服务器的OpenSSH使用的签名算法还是ssh-rsa,签名算法不兼容,于是无法认证,无法网上推代码。

如果想看解决办法,可以直接跳到末尾“解决办法”

起因

今天像往常一样把代码推到gitee上,发现推不上去,公钥认证错误,本来因为看论文而晕晕乎乎的脑袋瞬间清醒:我帐号不是被谁盯上了吧。

❯ git push origin master
git@gitee.com: Permission denied (publickey).
fatal: Could not read from remote repository.Please make sure you have the correct access rights
and the repository exists.

我密码都是最高级别的,从不用常用密码,公钥也设置了密码,如果有人突破了我的密码,那他照样能突破我其他密码,想到这不禁后背冒出一丝凉气。

不过冷静下来之后仔细想想,这个可能性比较低。首先,我就一学生,帐号没有多大价值;其次,我也没和人结下什么仇哇???;再次,我平时都非常注意帐号安全。

肯定不是帐号被盗了。

登上gitee帐号到个人信息页,查看ssh公钥,我发现ssh公钥的sha256sum和本地的公钥一致。

奇怪,gitee帐号里面的ssh公钥没有变,怎么会登不上呢?

然后就开始了一通研究。

研究

再次验证一下是不是能登录:

❯ ssh git@gitee.com
git@gitee.com: Permission denied (publickey).

神奇的是,我用同一个密钥登录github,是可以登录的:

❯ ssh git@github.com
Hi hedonihilist! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

这问题有意思了,得研究研究,首先启用ssh的-v选项(v越多越详细),查看登陆过程中的信息:

❯ ssh git@gitee.com -vv
... 省略不相关输出
debug2: set_newkeys: mode 0
debug1: rekey in after 134217728 blocks
debug1: Will attempt key: /home/z/.ssh/id_rsa RSA SHA256:DydDPeQMquAx9B6SkmNQMrV9JZsP6IrvMpBJn8b0Xek agent
debug1: Will attempt key: /home/z/.ssh/id_dsa
debug1: Will attempt key: /home/z/.ssh/id_ecdsa
debug1: Will attempt key: /home/z/.ssh/id_ecdsa_sk
debug1: Will attempt key: /home/z/.ssh/id_ed25519
debug1: Will attempt key: /home/z/.ssh/id_ed25519_sk
debug1: Will attempt key: /home/z/.ssh/id_xmss
debug2: pubkey_prepare: done
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Offering public key: /home/z/.ssh/id_rsa RSA SHA256:DydDPeQMquAx9B6SkmNQMrV9JZsP6IrvMpBJn8b0Xek agent
debug1: send_pubkey_test: no mutual signature algorithm
... 省略不相关输出

可以看到输出里面有一条信息no mutual signature algorithm ,翻译一下就是“没有公共的签名算法”,一番搜索之后发现这个链接,按照里面的操作可以顺利登录gitee。

又经历一番搜索之后,基本弄明白为什么会出现这个问题了,破案了!

原因

在登录过程中,需要通过签名的方式验证双方身份,我使用的是RSA密钥,其签名算法有多种,之前默认的算法是ssh-rsa,不过由于ssh-rsa这种签名算法不安全,所以在新版本的OpenSSH中,这种签名算法默认情况下不启用,取而代之的是rsa-sha2-512

我使用的是最新版的OpenSSH8.8,默认不启用ssh-rsa算法,gitee服务器使用的是较旧版的OpenSSH,使用的是ssh-rsa算法,而且gitee服务器也没有提供其余可供RSA密钥使用的签名算法。BANG!双方的签名算法不一致,可不就是“no mutual signature algorithm”嘛!

既然签名这一步都进行不下去,那认证就更不可能了,所以就认证错误了(Permission denied)。

还有一个令我好奇的问题没有弄明白:为什么github能登录?

答案是github为RSA类型密钥提供了额外的签名算法。

从下面命令的执行情况可以看出,github提供了一大串备用的签名算法

❯ ssh git@github.com -vvv 2>&1 | grep ssh-rsa
debug2: host key algorithms: rsa-sha2-512,rsa-sha2-256,ssh-rsa,ssh-dss
debug1: Server host key: ssh-rsa SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
debug1: kex_input_ext_info: server-sig-algs=<ssh-ed25519-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp256-cert-v01@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,sk-ecdsa-sha2-nistp256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com,rsa-sha2-256-cert-v01@openssh.com,ssh-rsa-cert-v01@openssh.com,ssh-dss-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,sk-ecdsa-sha2-nistp256@openssh.com,ssh-ed25519,ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,rsa-sha2-512,rsa-sha2-256,ssh-rsa,ssh-dss>

其中server-sig-algs说的就是服务器支持的签名算法,在这个列表中:

  • rsa-sha2-512
  • rsa-sha2-256
  • ssh-rsa
    都是RSA密钥的签名算法,ssh-rsa算法不能用了,可以用另外两个更加安全的嘛

解决办法

参考:这个链接

添加ssh配置

这里需要用到一个ssh配置项:PubkeyAcceptedKeyTypes,其含义是客户端支持的签名算法类型(参考)

对于ssh来说,使用-o选项可以方便地添加参数:

$ ssh git@gitee.com -o PubkeyAcceptedKeyTypes=+ssh-rsa

但是在git里面不太方便传ssh的参数,不过我们可以将参数写到ssh客户端的配置文件~/.ssh/config中:

Host gitee.comHostName gitee.comPubkeyAcceptedKeyTypes +ssh-rsa

这样设置之后,每次与gitee.com建立ssh链接时(无论是ssh或者git),都会启用ssh-rsa

自废武功

把自己的OpenSSH版本降低一点(降低到ssh-rsa还没被禁用的时候),这样就和gitee的兼容了。

不能惯着他

等到gitee更新OpenSSH版本、增加了新的可用的RSA签名算法之后,我再用它。

无法把代码推到gitee故障解决(OpenSSH签名算法不兼容)相关推荐

  1. 横河川仪压力变送器故障代码_压力变送器常见故障解决方法

    压力变送器常见故障解决方法 在压力变送器的使用过程中难免出现故障,下面我们针对几种故障的解决方法进行介绍. 一.压力指示不正确 1: 压力变送器电源是否正常 如果小于 12VDC ,则应检查回路中是否 ...

  2. sccm2012 客户端推送安装故障解决一例

    在SCCM2012中采用的高安全部署,webdav已经不再需要,客户端与分发点之间的数据传输全部采用https协议,包括WSUS的更新,在部署客户端推送安装期间遇到一个问题. SCCM2012同样提供 ...

  3. 主板诊断卡怎么用?主板诊断卡代码含义大全与故障解决办法

    https://www.jb51.net/diannaojichu/486656.html

  4. 台安变频器n2按键说明_台安变频器N2型号说明参数设置故障代码及故障解决方法...

    原标题:台安变频器N2型号说明参数设置故障代码及故障解决方法 台安变频器N2额定电压.功率范围: 220V单/三相(0.4KW-22KW) 380V三相(0.75KW-22KW) 台安变频器N2特点: ...

  5. 手机系统安装打印机服务器错误代码,OKI打印机报错?各型号代码故障解决方法...

    原标题:OKI打印机报错?各型号代码故障解决方法 这一期干货贴邀请大家一起看看OKI打印机常见报错代码↓↓↓ 1.报错代码 610/611/612/613 黄色/品红色/青色/黑色碳粉盒未安装 产生原 ...

  6. 惠普打印机故障代码_惠普打印机常见故障解决办法【图文详解】

    Hp打印机,也就是我们常说的惠普打印机,目前已经成了打印机行业中的最为人们熟知的品牌之一,不过对于大多数打印机来说,无论品牌好坏,总会在使用的过程中出现这样那样的问题,而惠普打印机在使用过程中是故障率 ...

  7. 代码托管平台Gitee使用教程

    代码托管平台Gitee Gitee简介 Git,Github,Gitlab,Gitee介绍 Gitee使用 1,登录注册 2,新建仓库 2,本地关联远程仓库 2.1,远端初始化 2.2,本地与远端关联 ...

  8. linux上使用git把代码push到gitee上

    欢迎大家关注笔者,你的关注是我持续更博的最大动力 原创文章,转载告知,盗版必究 linux上使用git把代码push到gitee上 文章目录: 1 git添加ssh公钥 2 代码推送的流程 从git的 ...

  9. 上传项目代码到Github|Gitee

    上传项目代码到Github|Gitee 文章目录 上传项目代码到Github|Gitee 1.前置准备 1.1 Git 安装 1.2 在 Git 中设置用户名 1.2.1 为计算机上的每个存储库设置 ...

最新文章

  1. SQLserver数据库操作帮助类SqlHelper
  2. 如何通过远程修改另一台电脑注册表
  3. HTC Element Behaviors in Internet Explorer.
  4. ACM模板--邻接表 无向图 Prim Kruskal Dijkstra
  5. python __init__ 构造函数
  6. 浏览器关闭 session并不会被干掉
  7. C++语言中std::array的神奇用法总结,你需要知道!
  8. C#实现外部图片的拖拽到应用程序的简单功能,附全部源码,供有需要的参考...
  9. Cesium中的常用坐标及转换
  10. redis cluster 分布式锁_Redis的分布式锁的实现原理
  11. 1036: [ZJOI2008]树的统计Count(树链剖分)
  12. 【捣鼓】TypeError: “x” is not a constructor
  13. 常见随机变量的数学期望和方差
  14. 打造一款可靠的WAF(Web应用防火墙)
  15. 10dayC语言项目 《后宫选妃》
  16. Python自动化爬取天眼查数据
  17. PC、手机老是掉线该如何排查?
  18. 工具类-随即获取姓名-ZH
  19. 【python】cholesky
  20. 最新最全论文合集——法律智能

热门文章

  1. 【最全】java面试题基础--完整汇总版
  2. win10搭建本地文件服务器,windows10本地服务器
  3. 计算机网络题库与答案--选择题
  4. 【王喆-推荐系统】评估篇-(task1)离线评估方法
  5. 开源Unity服务端客户端(双端C#)网络通讯框架(Lidgren)[一]
  6. 很哇塞的网页特效之摩天轮相册
  7. 个人简历管理系统(2)-数据库连接
  8. php请求lumen api,[laravel]如何用 lumen 构建 API
  9. Deep Back-Projection Networks For Super-Resolution
  10. 视频一键批量去重的方法与软件实现案例-咚咚剪辑