有很多关于如何使用 SSH 密钥建立与 VPS 的连接的材料(高质量文章的示例)。简而言之,使用ssh-keygen实用程序,您需要生成一对密钥(公钥和私钥),然后以某种方式将打开的密钥上传到 VPS。
根据该视频的解释,
像往常一样,我们通过不安全的通道(即互联网连接)传输数据包。我们使用公钥加密每个数据包,并使用私钥进行解密。公钥是公开的,万一有人拿到了也不可怕。它可以加密消息,但不能解密。
连接中的每个参与者都会创建一个公钥-私钥对,然后双方交换各自的公钥。
从逻辑角度来看,第一点难以理解的是,如果说密钥交换,为什么在本地机器和 VPS 上有一份公钥副本?原来客户端和服务器都用同一个公钥加密数据包?
但最重要的是:我们的说明中哪里提到了为服务器创建密钥对?我们在本地计算机上创建密钥并将公共密钥上传到服务器,以便可以解密来自服务器的响应。但是,如果没有私钥,服务器如何解密来自客户端的消息呢?
由于数据不可能以明文形式发送到服务器,因此我们只能断定VPS最初有私钥。但它与我们之前创建的公钥匹配吗?
让我们从这个解释不正确的事实开始:
所有流量均使用对称加密算法进行加密(请参阅RFC 4253,第 6.3 节),其密钥是在密钥交换期间根据每个会话生成的。该标准要求所有客户端和服务器支持 Diffie-Hellman 方案来生成密钥。
非对称服务器密钥在服务器配置文件中指定
/etc/ssh/sshd_config
。默认情况下,Debian/Ubuntu 中有三个密钥:椭圆曲线 (ECDSA)、Edwards 曲线 (Ed25519) 和 RSA 密钥这些密钥是在安装 Linux 时生成的。例如,在Debian中,在安装过程中执行命令
该命令打印密钥类型、位数、SHA1 哈希值。就像是:
ssh-keygen
当然,里面是霓虹灯。如果您对密钥的生成方式感兴趣,请查看debian/openssh-server.postinst
包源中的脚本openssh
当然,这些密钥与任何客户端密钥都不匹配。这些密钥用于确认服务器的真实性。当您第一次连接到服务器时,ssh 客户端会问您 - 您确定正确的服务器回答了您吗?
ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub
此对话假设您从某处知道服务器密钥的哈希值(您可以使用服务器上的命令找到它)如果您回答y
,客户端会将生成的公钥保存到数据库中$HOME/.ssh/known_hosts
:回答你的最后一个问题:是的,服务器最初有私钥。它们是在安装包时生成的
openssh-server
。是的,这些密钥与您在客户端生成的密钥完全不同。仅当您想在没有密码的情况下使用密钥进行身份验证时,客户端的公钥才会上传到服务器(这是正确的!我支持您)。此外,它不是随处下载,而是添加到
$HOME/.ssh/authorized_keys
.假设只有用户有权访问该文件,因此可以信任该文件中的密钥。但一般情况下,不需要将客户端的公钥上传到服务器。大多数服务器支持用户/密码身份验证,不需要公钥。