如何修复 “Peer Certificate or SSH Remote Key Was Not OK” 错误信息

深入剖析与解决 "Peer Certificate or SSH Remote Key Was Not OK" 错误

"Peer Certificate or SSH Remote Key Was Not OK" 这个错误信息常常出现在使用 SSH 连接远程服务器时,它表明客户端无法验证服务器的身份,或者服务器无法验证客户端的身份。这个错误看似简单,但背后的原因却可能多种多样,涉及到证书、密钥、网络配置等多个方面。本文将深入探讨这个错误的各种成因,并提供详细的解决方案,帮助你彻底解决这个问题。

一、理解错误的根源

这个错误信息实际上包含了两种可能性:

  • Peer Certificate Was Not OK: 指的是客户端无法验证服务器提供的 SSL/TLS 证书。这通常发生在使用基于证书的 SSH 连接时。
  • SSH Remote Key Was Not OK: 指的是客户端无法验证服务器的 SSH 主机密钥。这是更常见的情况,通常发生在首次连接一个新的 SSH 服务器,或者服务器的 SSH 主机密钥发生变化时。

二、针对 "SSH Remote Key Was Not OK" 的解决方案

  1. 确认服务器身份: 这是最重要的一步。在首次连接一个新的 SSH 服务器时,你会看到一个类似下面的警告信息,显示服务器的指纹:

The authenticity of host 'example.com (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

你需要通过其他可靠的渠道(例如,向服务器管理员确认)验证这个指纹是否正确。如果指纹不匹配,很可能你连接到了一个伪造的服务器,这非常危险!

  1. 手动添加主机密钥: 确认服务器身份后,输入 yes 将主机密钥添加到 known_hosts 文件中。这个文件通常位于 ~/.ssh/known_hosts%USERPROFILE%\.ssh\known_hosts。之后再次连接就不会出现这个警告了。

  2. 使用 ssh-keyscan 添加主机密钥: 如果你需要自动化这个过程,可以使用 ssh-keyscan 命令获取服务器的公钥并添加到 known_hosts 文件中:

bash
ssh-keyscan example.com >> ~/.ssh/known_hosts

  1. known_hosts 文件权限问题: 如果 known_hosts 文件的权限设置不正确,SSH 客户端可能无法读取或写入该文件,从而导致错误。确保该文件的权限设置为 600644

bash
chmod 600 ~/.ssh/known_hosts

  1. known_hosts 文件损坏: 如果 known_hosts 文件损坏,可能会导致各种问题,包括这个错误。尝试删除或重命名该文件,然后重新连接服务器:

bash
mv ~/.ssh/known_hosts ~/.ssh/known_hosts.old

  1. StrictHostKeyChecking 选项: 在某些情况下,你可能需要临时禁用主机密钥检查,例如在自动化脚本中。可以使用 -o StrictHostKeyChecking=no 选项,但这会降低安全性,不建议在生产环境中使用:

bash
ssh -o StrictHostKeyChecking=no [email protected]

  1. SSH 配置文件: 检查你的 SSH 配置文件 (~/.ssh/config%USERPROFILE%\.ssh\config) 是否存在任何冲突的配置,例如指定了错误的主机名或端口。

  2. 中间人攻击: 如果你的网络连接被劫持,攻击者可能会伪造服务器的 SSH 主机密钥。使用 VPN 或其他安全连接方式可以降低这种风险。

三、针对 "Peer Certificate Was Not OK" 的解决方案

  1. 验证服务器证书: 与主机密钥类似,你需要验证服务器提供的 SSL/TLS 证书是否有效。检查证书的颁发者、有效期和域名是否与你连接的服务器匹配。

  2. 添加证书颁发机构 (CA) 证书: 如果服务器证书是由一个受信任的 CA 颁发的,但你的系统不信任该 CA,你需要将 CA 的证书添加到你的信任存储中。具体方法取决于你的操作系统和 SSH 客户端。

  3. 使用 -o CheckHostIP=no 选项: 如果服务器证书的域名与服务器的 IP 地址不匹配,可以使用 -o CheckHostIP=no 选项禁用 IP 地址检查。但这也会降低安全性,不建议在生产环境中使用。

  4. 使用 -o UserKnownHostsFile=/dev/null-o StrictHostKeyChecking=no: 这是一种极端情况,完全禁用主机密钥和证书验证。只应在测试环境或其他特殊情况下使用。

  5. 更新 SSH 客户端: 旧版本的 SSH 客户端可能不支持某些新的加密算法或证书格式,导致无法验证服务器证书。尝试更新到最新版本的 SSH 客户端。

四、其他可能的原因和解决方案

  1. 网络连接问题: 网络连接中断或不稳定也可能导致这个错误。检查你的网络连接是否正常。

  2. 防火墙: 防火墙可能会阻止 SSH 连接。确保防火墙允许 SSH 流量通过。

  3. DNS 解析问题: 如果 DNS 解析错误,你可能会连接到错误的服务器。检查你的 DNS 设置。

  4. 服务器端配置问题: 服务器端的 SSH 配置也可能导致这个错误。检查服务器的 SSH 配置文件 (/etc/ssh/sshd_config) 是否正确。

五、最佳实践

  1. 定期更新 SSH 客户端和服务器: 这有助于修复安全漏洞并确保兼容性。

  2. 使用强密码或密钥对: 避免使用弱密码,并使用密钥对进行身份验证。

  3. 启用双因素认证: 这可以进一步提高安全性。

通过理解 "Peer Certificate or SSH Remote Key Was Not OK" 错误的各种成因,并采取相应的解决方案,你可以有效地解决这个问题,并确保你的 SSH 连接安全可靠。 记住,在解决这个问题的过程中,安全始终应该是首要考虑因素。 不要轻易禁用安全检查,除非你完全理解其带来的风险。 希望本文能帮助你彻底解决这个常见但又棘手的 SSH 错误。

THE END