我正在考虑使用JSch库(或实际上是sharpSSH C#端口)为SFTP设置公钥客户端和服务器身份验证。遗憾的是,我找不到关键加载函数使用的文件格式的任何文档:
jsch.addIdentity(filename, passphrase);
jsch.setKnownHosts(filename);
私钥和已知主机文件使用什么文件格式?
答案 0 :(得分:8)
JSch使用OpenSSH 密钥文件格式(公钥和私钥)。我没有找到这种格式的规范,但您可以使用OpenSSH的ssh-keygen工具将密钥从/转换为其他格式(而Google将显示其他转换/更多格式的工具)。
更新:在询问OpenSSH邮件列表并阅读一些RFC之后,看起来OpenSSH的公钥文件包含(对于版本2密钥)RFC 4253 (section 6.6)中指定的公钥,只是用它包围一个base64(并且键类型作为前缀,注释字段作为后缀)。我还没有找到私钥文件的规范。
不幸的是,JSch的官方文档几乎不存在,但我确实为它写了一些Javadocs。 (虽然似乎没有提到密钥文件格式......我将不得不解决这个问题。) JSch Wiki中还有Manual,其中包含一个关于public key authentication的页面(还没有提到关键格式: - /)。
已知主机文件的格式与OpenSSH客户端的相应文件格式相同。它的格式在OpenSSH's sshd manual page, SSH知道主机文件格式部分进行了解释:
这些文件中的每一行都包含以下字段:标记 (可选),主机名,位,指数,模数,注释。这些领域是 用空格分隔。
这实际上只适用于SSH 1 RSA密钥。对于SSH 2密钥,您有一个类型标识符(ecdsa-sha2-nistp256
,ecdsa-sha2-nistp384
,ecdsa-sha2-nistp521
,ssh-dss
或ssh-rsa
),然后是base-64编码的密钥形成。 (有关授权密钥文件,请参阅同一手册页中的一点内容)。 (我认为JSch只支持DSA和RSA密钥格式,没有ECDSA。)
请注意,这些文件中的行通常是数百个字符 很长,你肯定不想手动输入主机键。 相反,通过脚本,ssh-keyscan(1)或通过获取来生成它们 /etc/ssh/ssh_host_key.pub并在前面添加主机名。 ssh-keygen(1)还提供了一些基本的自动编辑功能 〜/ .ssh / known_hosts包括删除与主机名匹配的主机 将所有主机名转换为其哈希表示。