为什么需要向服务端添加公钥?

看关于非对称加密的技术博客,说的都是 皇帝唯一持有私钥,并把公钥公告天下,可以让平民所有。

以 git 的 pull 操作和 vscode 的 ssh 免密登录为例子:

  • git pull 之前,需要把自己 pc 客户端生成的公钥上传到 github 等网站,然后才能 git pull 成功
  • vscode 的 ssh 的免密登录也是需要把 pc 客户端的公钥上传到服务器的 ~/.ssh/authorized_keys 文件中

这里就有古怪了呀,到底是客户端是皇帝还是服务端是皇帝呀?

按理来说,服务端是怕被黑的,所以皇帝应该是服务端才对呀。

难道说客户端和服务端是都是皇帝,且互为平民?

阅读 2.8k
1 个回答

这个比方其实不是特别恰当,因为对理解非对称加密没啥帮助。

本质上就是加密方持有公钥,用公钥加密;解密方持有私钥,用私钥解密

加密方和解密方的身份对于一次通讯来说,是双方都具备的,所以其实有两对公私钥

你给 GitHub 发起请求,那你就是加密方,你要用你 GitHub 的公钥加密自己的请求数据;GitHub 就是解密方,它用自己存储的私钥解密。

GitHub 给你返回响应,那 GitHub 就是加密方,GitHub 用你上传过的公钥加密它的响应数据;你就是解密方,你用自己的私钥解密,所以 GitHub 不需要知道你的私钥。

P.S. 你要是问“GitHub 的公钥哪来的?我也没下载过也没配置过啊?”这种问题的话,建议仔细回想一下首次建立一个 SSH 链接时,是不是有下面这样的提示:

The authenticity of host 'example.com (11.22.33.44)' can't be established.
RSA key fingerprint is 99:88:77:66:55:44:33:22:11:00:aa:bb:cc:dd:ee:ff.
Are you sure you want to continue connecting (yes/no)?
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题