3

我在 PHPStorm 中使用 subversion,当我尝试连接到 SVN 服务器时出现以下错误...

无法建立主机svn+ssh://svn.example.com:22的真实性。ssh-rsa 密钥指纹是

xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx

确定要继续连接吗?

问题是指纹与服务器的指纹不匹配。如果我从 ~/.ssh/known_hosts 文件中删除服务器,然后 ssh 到它会显示一个完全不同的指纹 - 这是该服务器的正确指纹。

我刚刚将 SVN 存储库移动到新服务器,并将 DNS 更改为指向新服务器,所以我期待 PHPStorm 抱怨指纹不匹配,但我很惊讶它没有显示新服务器的正确指纹. 指纹也不匹配旧服务器,或者 PHPStorm 曾经连接到的任何其他服务器。在我了解发生了什么之前,我很担心让它连接起来。

PHPStorm 正确连接到新服务器,所以我看不出它是如何获得错误的指纹的,而且我似乎不太可能在中间攻击中看到一个真正的人,因为每当我从命令行 ssh 时它看到正确的指纹。

我不确定 PHPStorm 在哪里缓存服务器指纹。我尝试过使缓存无效,看看这是否会使其忘记任何过时的指纹数据,但鉴于报告的指纹与旧服务器或新服务器不匹配,这似乎不太可能。

我得出的结论是这是 PHPStorm 中的一个错误,但任何其他想法都会非常受欢迎。

编辑:

PHPStorm 显示一个 20 字节的指纹。在服务器上运行它(debian)

ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key

显示一个 16 字节的指纹,因此它们不可能匹配。有没有办法从服务器的公钥中获取 20 字节的指纹?

4

1 回答 1

3

所以事实证明 PHPStorm 显示的 160 位(20 字节)哈希是 SHA1 哈希,而 ssh-keygen 显示的是 128 位(16 字节)MD5 哈希。

两者都不是很明确,所以我刚刚编写了一个快速脚本来显示公钥的各种散列(假设你的公钥在 /etc/ssh/ssh_host_rsa_key.pub

#!/usr/bin/python

import binascii
import hashlib

keyfile = "/etc/ssh/ssh_host_rsa_key.pub"

def showHash(type, hash, data):
    hash.update(data)
    hex=hash.hexdigest()
    hexbytes=[hex[i:i+2] for i in range(0, len(hex), 2)]
    hexstring=":".join(hexbytes)
    print type+" "+hexstring

f = open(keyfile)
words = f.readline().split()
data=words[1]
bindata=binascii.a2b_base64(data)

showHash("md5", hashlib.md5(), bindata)
showHash("sha1", hashlib.sha1(), bindata)
showHash("sha256", hashlib.sha256(), bindata)

事实证明 PHPStorm 使用的是 SHA1 哈希,并且非常正确。但是,如果您可以选择在 ssh-keygen(我相信您可以在 sh-keygen-g3 中)或 PHPStorm 中使用哪个散列函数,那将会很有帮助。

于 2013-01-09T13:29:58.287 回答