0%

日常解惑-记录一次ssh调试的问题

前请摘要

把博客部署到国内的网站,这样可以快速访问,因为国外实在有点慢。虽然没办法备案导致无法使用域名,但是自己偶尔看看顺便复习下以前学过的知识,这点也无伤大雅了。

按照网上相关教程进行部署,部署完成之后hexo -d,发现部署不上去,错误提示是拒绝访问。

解决流程

首先先单独用ssh连接目标服务器:ssh -T git@公网ip,其中-T选项的意思是禁用伪终端分配,也就是不需要终端,因为仅仅只是测试连接性而已。

然后出现结果:Permission denied (publickey).

有了问题,首先自然想到的是debug。ssh命令只需要加入-vvv就可以打印出详细调试信息。

我稍微看了下,用的私钥是~/.ssh/id_rsa,但是服务器上用的公钥它只显示了sha256码,然后就出现两者无法匹配的问题。

所以我首先自己猜测:是不是密钥不匹配?首先我先把公钥从服务器上拿下来,然后利用ssh-keygen -y -e -f ~/.ssh/id_rsa命令,从私钥生成对应的公钥,查看两者确实是一样的,也就是我的私钥确实能够匹配上公钥的,那为什么会出现拒绝配对的问题呢?

最后通过网上搜索解决了这个问题:

远程服务器公钥文件夹权限错误(.ssh.ssh/authorized_keys需要保证只有用户自己有权限,否则验证无效),这个.ssh我当时为了图省事,是直接从root中复制的,导致了这个文件夹的所有者和所属组都是root,也就导致了虽然私钥公钥是匹配的,但是无法登录的问题,利用chown -R就解决了。

思考

看上去问题解决是那么简单,但是里面有一点困扰了我很久很久:为什么能从私钥推出公钥?

之前上《信息安全数学基础》的时候,我还自己手推过,得出了和下面一样的结论:

  • 公钥和私钥成对出现
  • 公开的密钥叫公钥,只有自己知道的叫私钥
  • 用公钥加密的数据只有对应的私钥可以解密
  • 用私钥加密的数据只有对应的公钥可以解密
  • 如果可以用公钥解密,则必然是对应的私钥加的密
  • 如果可以用私钥解密,则必然是对应的公钥加的密

公钥和私钥是相对的,两者本身并没有规定哪一个必须是公钥或私钥。

简单来说,就是用RSA生成的两个密钥明明是等价的,一个用来加密另一个用来解密,哪个成为公钥,哪个成为私钥,完全是处于用户个人的喜好,即用户把哪个公开,哪个就是公钥。

但是,我确实从ssh-keygen这个程序,通过私钥生成了公钥,那岂不是说明,只要获取了私钥,就同时获取了公钥,那和上面的就矛盾了….

就是这个问题困扰了我很久,最后同学给出了答案:

数学上的公私钥其实是等价的,但是实际工具中不是的,为了方便使用,数据结构不一样的

所以在实际中,只要把程序生成的私钥保存好就可以了(笑)