5

我正在考虑使用 JSch 库(或者实际上是它的sharpSSH C# 端口)为 SFTP 设置公钥客户端和服务器身份验证。不幸的是,我找不到关键加载功能使用的文件格式的任何文档:

jsch.addIdentity(filename, passphrase);
jsch.setKnownHosts(filename);

私钥和已知主机文件使用什么文件格式?

4

1 回答 1

9

JSch 使用 OpenSSH密钥文件格式(用于公钥和私钥)。我没有找到这种格式的规范,但您可以使用 OpenSSH 的ssh-keygen工具将密钥从/转换为其他格式(Google 将展示其他转换/转换为更多格式的工具)。

更新:在询问 OpenSSH 邮件列表并阅读一些 RFC 之后,看起来 OpenSSH 的公钥文件包含(对于版本 2 密钥)RFC 4253(第 6.6 节)中指定的公钥,只是用 base64 环绕它(键类型作为前缀,注释字段作为后缀)。我还没有找到私钥文件的规范。

不幸的是,JSch 的官方文档几乎不存在,但我确实为它写了一些Javadocs。(虽然似乎没有提到密钥文件格式......我必须解决这个问题。)JSch Wiki 中还有一个手册,其中包含一个关于公钥认证的页面(也没有提到密钥格式然而 :-/)。

已知的hosts文件也和OpenSSH客户端对应的文件格式相同。它的格式在OpenSSH 的 sshd 手册页SSH KNOWN HOSTS FILE FORMAT部分进行了说明:

这些文件中的每一行都包含以下字段:标记(可选)、主机名、位、指数、模数、注释。字段由空格分隔。

这实际上仅适用于 SSH 1 RSA 密钥。对于 SSH 2 密钥,您有一个类型标识符(ecdsa-sha2-nistp256ecdsa-sha2-nistp384、或) ecdsa-sha2-nistp521,然后是 base-64 编码形式的密钥。(有关授权密钥文件,请参阅同一手册页中的一些内容)。(我认为 JSch 只支持 DSA 和 RSA 密钥格式,不支持 ECDSA。)ssh-dssssh-rsa

请注意,这些文件中的行通常有数百个字符长,您绝对不想手动输入主机密钥。相反,通过脚本 ssh-keyscan(1) 或通过获取 /etc/ssh/ssh_host_key.pub 并在前面添加主机名来生成它们。ssh-keygen(1) 还为 ~/.ssh/known_hosts 提供了一些基本的自动编辑,包括删除与主机名匹配的主机并将所有主机名转换为它们的散列表示。

于 2011-11-13T21:58:09.400 回答