我想在我的计算机和服务器之间建立一个 SFTP 连接。
我在我的电脑上生成了一对密钥,并将我的公钥写入服务器上的“authorized_keys”文件中。我确信它有效,因为当我尝试从没有我的私钥的计算机进行连接时(我知道,其他人不应该有我的私钥),系统会要求输入密码。
根据这个图片,我的服务器是 Bob,我的计算机是 Alice。当服务器发送消息时,它使用我的公钥来加密,我使用我的私钥来解密。但如果我向服务器发送消息,它不是加密的,对吗?如果是,它是如何加密的?
根据我对非对称加密的理解,如果我想加密我发送的消息,我必须在服务器上生成一对密钥并将其公钥放在我电脑的“authorized_keys”文件中,对吗?
我怎么能够核实连接是否双向(发送和接收)都是安全的?
谢谢!
答案1
SSH 连接中发生了两件主要的事情:
服务器身份验证和加密
服务器会向您发送其公钥,您必须信任它。在此之前,您可以手动获取它,并且在理想的安全环境中,您永远不会在知道其公钥正确之前连接到 SSH 服务器。这就是 CA 的用途,它们会签署服务器公钥。在大多数 SSH 环境中,您只需以客户端身份接受服务器的公钥。这是最初的“您是否要信任此服务器并将其添加到您的列表中?”问题。服务器公钥存储在 Linux 系统中的客户端的 .ssh/known_hosts 下。
连接的实际加密并不是不对称的。 这是许多人对私钥/公钥加密的一个巨大误解。它太慢了。实际上,服务器和客户端会生成一个共享密钥(又称长密码),该密钥对称加密针对此会话。客户端和服务器使用非对称加密,直到他们就共享密钥达成一致。之后,他们切换到对称加密,并以此共享密钥作为密钥。
这种加密方式是最常见的,被称为混合加密,尽管几乎每个人(错误地)称之为非对称加密。
“真正的”纯非对称加密的一个例子是使用 PGP 的邮件加密,因为每条消息都是非对称加密的。
另外:共享秘密不会永久存储,每个新会话都会协商一个新的共享秘密。
客户端身份验证
这是完全不同的事情,它可以是密码和/或基于密钥的身份验证。客户端的公钥(位于 ~/.ssh/id_rsa.pub 下)必须存在于服务器的 authorized_keys 文件中(例如对于 root:/root/.ssh/authorized_keys)。以前ssh-copy-id
人们会做类似的事情
cat ~/.ssh/id_rsa.pub | ssh root@server "cat >> ~/.ssh/authorized_keys"
将您的密钥附加到服务器的authorized_keys。
客户端证书不用于加密,仅用于身份验证。
重要编辑:使帖子更加清晰,以ssh-copy-id
避免误解。
到目前为止,ssh-copy-id
这是将客户端公钥添加到服务器的最佳实践方法。我刚刚发布了该cat
方法,以显示双方操作了哪些文件,以显示私钥和公钥之间的联系以及它们如何存储。
使用 cat 时,可能会忘记“>”,例如,覆写您的 authorized_keys 文件(在 Linux 中,“>>”表示附加,“>”表示覆盖)。直接操作配置文件时要负责任。感谢@Rallph 指出这一点。
答案2
服务器有自己的密钥对。首次连接到 SSH 服务器时,SSH/SFTP 客户端会提示您是否信任服务器的主机密钥(=公钥)。
只有在你仔细验证它确实是服务器的合法公钥后,你的连接才是安全的。请参阅我的文章在哪里可以获取 SSH 主机密钥指纹来授权服务器?
还要注意,你的密钥对和服务器的密钥对实际上都不用于加密数据。这要复杂得多。
也可以看看: