7

我目前正在创建一个 SSIS 包,我需要在其中连接到安全服务器以复制一些文件,并且我想通过服务器发送的公钥指纹来验证连接。

我对这方面不是很熟悉,我是否总是期望连接时会发送指纹?

该包之前使用 WinSCP,并且指纹以ssh-dss 1024 [hex representation]. 我假设这种格式取自 PuTTY,因为这是我在连接到新服务器时看到它的方式,它要求我进行验证。WinSCP 照原样处理了验证。

我打算切换到 SSH.NET,它的机制需要我手动检查指纹。我可以仅根据十六进制验证连接,还是还需要检查密钥长度和使用的算法?

4

2 回答 2

14

您可以仅基于十六进制来执行此操作 - 首先您需要编写(或复制/使用)一个实用方法来将您的十六进制字符串转换为字节数组(这将取决于您的十六进制字符串的格式) - 示例下面用于转换由冒号分隔的字符串(例如“1d:c1:5a:71:c4:8e:a3:ff:01:0a:3b:46:17:6f:e1:52”)

public static byte[] ConvertFingerprintToByteArray( String fingerprint )
{
    return fingerprint.Split( ':' ).Select( s => Convert.ToByte( s, 16 ) ).ToArray();
}

然后,您只需附加到对象的HostKeyReceived事件SftpClient

SftpClient sftpClient = new SftpClient( Hostname, Username, Password );
sftpClient.HostKeyReceived += delegate ( object sender, HostKeyEventArgs e )
{
    var b = ConvertFingerprintToByteArray(
        "1d:c1:5a:71:c4:8e:a3:ff:01:0a:3b:46:17:6f:e1:52" );
    if( e.FingerPrint.SequenceEqual( b ) )
        e.CanTrust = true;
    else
        e.CanTrust = false;
};

如果此检查失败,则 SSH.NET 将抛出SshConnectionException- 并显示“密钥交换协商失败”的消息。

希望这可以帮助。

于 2016-01-28T13:21:01.227 回答
1

@ViniH 的答案曾经是正确的,但现在已经过时了。如今,您需要使用 SHA-256 哈希,而不是 MD5。要计算 SHA-256,您可以使用System.Security.Cryptography.SHA256Managed带有HostKeyEventArgs.HostKey.

此外,您可能希望用于Convert.ToBase64String获取 SHA-256 指纹的通用 Base64 表示

sftpClient.HostKeyReceived += (object sender, HostKeyEventArgs e) =>
{
    string sha256Fingerprint =
        Convert.ToBase64String(new SHA256Managed().ComputeHash(e.HostKey));
    e.CanTrust = (sha256Fingerprint == "1hI1HqP3IzoOWCABHGS7+GsrP2JUVsSs7oskK7HGP1E=");
};
于 2021-05-04T07:18:01.673 回答