暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SSH使用密钥连接远程服务器背后的过程是什么

运维笔谈 2024-05-18
71

当使用SSH进行免密登录时,这一过程大致遵循以下步骤:

1. 生成公钥和私钥密钥对

首先,在客户端机器上,需要生成一个ssh密钥对,通常使用 ssh-keygen 命令,会创建一对密钥:一个私钥(默认为:id_rsa ),存储在本地且必须保密;另一个公钥(默认为:id_rsa.pub ),可以公开。

2. 公钥复制到远程服务器

将生成的公钥 id_rsa.pub 添加到远程服务器上的用户的家目录下,如:~/.ssh/authorized_keys 文件中。可以通过手动复制粘贴公钥内容到远程服务器注意此文件权限600,或者使用 ssh-copy-id 命令复制到远程的服务器上。

3. 发起SSH请求

客户端机器使用 ssh 用户名@远程主机 命令发起连接,SSH客户端会查找默认的密钥文件(通常是`~/.ssh/id_rsa`等)以及其他密钥文件需要ssh -i 指定,如:ssh -i ~/.ssh/my_special_key_rsa user@example.com 

4. 密钥验证过程

  • 密钥交换:连接建立初期,ssh客户端和服务器会协商加密算法并进行密钥交换,确保后续通信的加密性。

  • 身份验证请求:服务器会请求客户端证明其身份。SSH客户端此时会查找并尝试使用所有可用的私钥(默认位置或其他配置指定的位置)。

  • 公钥匹配:客户端向服务器发送一个签名,这个签名是用本地私钥对服务器提供的随机数据进行加密的结果。服务器使用之前存放在authorized_keys 文件中的对应公钥验证这个签名。如果找到匹配,服务器生成一个随机数并使用该公钥加密后发送给客户端。

  • 授权:客户端用对应的私钥解密这个随机数,并将其回传给服务器。如果解密成功,服务器验证通过,允许登录。


假如有很多公钥,那么如何知道用的是哪个公钥呢?在客户端的 ~/.ssh 目录下,可以查看存在的公钥文件(如 id_rsa.pub,id_ed25519.pub 等)来确定有哪些公钥可用。

如果想要确切知道某次ssh连接使用了哪个公钥,可以在发起ssh请求时加上`-v`或`-vv`(更高详细级别)的参数,这将使得ssh客户端输出详细的调试信息,其中包括使用的密钥文件路径。

例如,运行 ssh -v 用户名@远程主机 ,在输出的日志中,类似于以下的信息,指示了SSH尝试使用哪些密钥进行认证:

或者ssh配置文件指定密钥,可以在 ~/.ssh/config 文件中为每个远程主机指定应使用的密钥对。这样可以精确控制连接特定主机时使用哪个密钥。配置示例如下:

       Host exampleHost
    HostName example.com
    User yourUsername
    IdentityFile ~/.ssh/special_key_rsa
     

    “运维笔谈”公众号,对话回复 “linux故障处理” ,可以获得 “阿里云运维实战手册-linux故障处理和修复.pdf” 。

    如果您在日常运维工作中遇到了任何问题或挑战,无论是关于系统配置、性能优化、故障排除还是其他方面,都欢迎您随时留言或私信我。我会尽我所能为您提供解决方法或建议。相互学习,积累更多的经验和知识。

    文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论