我是安全领域的新手,想了解我遇到的这个错误:
com.jcraft.jsch.JSchException: UnknownHostKey: 127.0.0.1。RSA 密钥指纹为 a2:39:3f:44:88:e9:1f:d7:d1:71:f4:85:98:fb:90:dc,位于 com.jcraft.jsch.Session.checkHost(Session.java:797),位于 com.jcraft.jsch.Session.connect(Session.java:342),位于 com.jcraft.jsch.Session.connect(Session.java:183),位于 FileTransfer.main(FileTransfer.java:37),进程退出,退出代码为 0。
“unknownHostKey: 127.0.0.1”是什么意思。RSA 密钥
指纹为 a2:39:3f:44:88:e9:1f:d7:d1:71:f4:85:98:fb:90:dc`
我需要设置一个名为 known_hosts
文件的文件,以便修复此错误:
我尝试像这样进行设置:
127.0.0.1
但这不起作用。我误解了 known_hosts
文件的含义吗?
答案1
此答案归功于吉尔斯来自StackExchange 安全网站,作为他/她的邮政解释known_hosts
和authorized_keys
文件是理解 SSH/SFTP 这一组件的一个很好的起点。
见下文:
该known_hosts
文件允许客户端验证服务器,以检查它是否未连接到模仿者。该authorized_keys
文件允许服务器验证用户。
服务器身份验证
建立 SSH 连接时发生的第一件事就是服务器将其公钥发送给客户端,并证明(得益于公钥加密) 向客户端表明它知道相关的私钥。这将验证服务器的身份:如果协议的这一部分成功,则客户端知道服务器就是它所声称的那个服务器。
客户端可以检查服务器是否是已知的,而不是一些试图冒充正确服务器的流氓服务器。 SSH 仅提供一种简单的机制来验证服务器的合法性:它会在~/.ssh/known_hosts
客户端计算机上的文件中记住您已经连接的服务器(还有一个系统范围的文件/etc/ssh/known_hosts
)。 第一次连接到服务器时,您需要通过其他方式检查服务器提供的公钥是否确实是您要连接的服务器的公钥。 如果您有即将连接的服务器的公钥,则可以~/.ssh/known_hosts
手动将其添加到客户端。
顺便说一句,known_hosts
可以包含 SSH 实现支持的任何类型的公钥,而不仅仅是 DSA(还有 RSA 和 ECDSA)。
在向服务器发送任何机密数据之前,必须先对其进行身份验证。特别是,如果用户身份验证涉及密码,则不得将密码发送给未经身份验证的服务器。
用户认证
只有当远程用户可以证明自己有权访问该帐户时,服务器才会允许该用户登录。根据服务器的配置和用户的选择,用户可能会提供几种形式的凭据之一(以下列表并不详尽)。
- 用户可以提供他试图登录的帐户的密码;然后服务器验证该密码是否正确。
- 用户可以提供公钥并证明他拥有与该公钥关联的私钥。这与用于验证服务器的方法完全相同,但现在用户正在尝试证明其身份,而服务器正在验证它。如果用户证明他知道私钥并且公钥在帐户的授权列表中(
~/.ssh/authorized_keys
在服务器上),则登录尝试被接受。 - 另一种方法是将部分用户身份验证工作委托给客户端计算机。这种情况发生在受控环境中,例如企业,此时许多计算机共享相同的帐户。服务器使用与客户端计算机相同的机制对客户端计算机进行身份验证,然后依靠客户端对用户进行身份验证。