警告 | SSHJ 0.37.0 及以下版本容易受到 CVE-2023-48795 - Terrapin 的攻击。请升级到0.38.0或更高版本。 |
首先,请看一下其中一个示例。希望您会发现该 API 使用起来很愉快:)
要获得 SSHJ,您有两种选择:
将 SSHJ 的依赖项添加到您的项目中。
自己构建 SSHJ。
而且,如果需要,您还可以运行 SSHJ 示例。
此处未提供 SSHJ 的二进制版本,但如果需要,可以直接从 Maven 中央存储库下载。
如果您使用 Maven 构建项目,则可以将以下依赖项添加到pom.xml
:
< dependency >
< groupId >com.hierynomus</ groupId >
< artifactId >sshj</ artifactId >
< version >0.38.0</ version >
</ dependency >
如果您的项目是使用另一个使用 Maven 中央存储库的构建工具构建的,请将此依赖项转换为您的构建工具使用的格式。
克隆 SSHJ 存储库。
确保您安装了具有无限强度 Java 加密扩展 (JCE) 的 Java6。
运行命令./gradlew clean build
。
在examples
目录中,有一个单独的 Maven 项目,它展示了如何在一些示例案例中使用该库。如果您想运行它们,请遵循以下准则:
安装 Maven 2.2.1 或更高版本。
克隆 SSHJ 存储库。
进入examples
目录并运行命令mvn eclipse:eclipse
。
将examples
项目导入 Eclipse。
更改示例类中的登录详细信息(地址、用户名和密码)并运行它们!
读取known_hosts文件以进行主机密钥验证
公钥、密码和键盘交互式身份验证
命令、子系统和 shell 通道
本地和远程端口转发
scp + 完整的sftp版本0-3实现
包括以下算法的实现/适配器:
aes{128,192,256}-{cbc,ctr}
、 aes{128,256}[email protected]
、 blowfish-{cbc,ctr}
、 [email protected]
、 3des-{cbc,ctr}
、 twofish{128,192,256}-{cbc,ctr}
, twofish-cbc
、 serpent{128,192,256}-{cbc,ctr}
、 idea-{cbc,ctr}
、 cast128-{cbc,ctr}
、 arcfour
、 arcfour{128,256}
SSHJ 还支持以下扩展(非官方)密码: camellia{128,192,256}-{cbc,ctr}
, camellia{128,192,256}-{cbc,ctr}@openssh.org
diffie-hellman-group1-sha1
、 diffie-hellman-group14-sha1
、 diffie-hellman-group14-sha256
、 diffie-hellman-group15-sha512
、 diffie diffie-hellman-group16-sha512
、 diffie-hellman-group17-sha512
、 diffie-hellman-group18-sha512
diffie-hellman-group-exchange-sha1
、 diffie-hellman-group-exchange-sha256
、 ecdh-sha2-nistp256
、 ecdh-sha2-nistp384
、 ecdh-sha2-nistp521
、 [email protected]
SSHJ 还支持以下扩展(非官方)密钥交换算法: `[email protected]`、`diffie-hellman-group15-sha256`、`[email protected]`、`[email protected] `, `diffie-hellman-group16-sha256`、`[email protected]`、`[email protected]`、`[email protected] `
ssh-rsa
、 ssh-dss
、 ecdsa-sha2-nistp256
、 ecdsa-sha2-nistp384
、 ecdsa-sha2-nistp521
、 ssh-ed25519
、 ssh-rsa2-256
、 ssh-rsa2-512
hmac-md5
、 hmac-md5-96
、 hmac-sha1
、 hmac-sha1-96
、 hmac-sha2-256
、 hmac-sha2-512
、 hmac-ripemd160
、 [email protected]
[email protected]
, [email protected]
、 [email protected]
、 [email protected]
、 [email protected]
、 [email protected]
, [email protected]
zlib
和[email protected]
(延迟的 zlib)
pkcs5
、 pkcs8
、 openssh-key-v1
、 [email protected]
、 [email protected]
如果您需要未包含的内容,添加它应该不会太难(一定要贡献它!)
SSH 实现比较
Java 8 或更高版本
SLF4J 2.0.0
充气城堡
问题跟踪器:https://github.com/hierynomus/sshj/issues
叉开!
缓解的 CVE-2023-48795 - Terrapin
合并#917:实施 OpenSSH 严格密钥交换扩展
合并#903:修复写入已知主机密钥字符串的问题
合并#913:防止远程端口转发缓冲区无限增长
将测试移至 JUnit5
合并 #827:回退到 [email protected] 扩展(如果可用)
合并#904:添加 ChaCha20-Poly1305 对 OpenSSH 密钥的支持
合并#899:添加对 AES-GCM OpenSSH 私钥的支持
合并#901:修复 ZLib 压缩错误
合并#898:改进了 OpenSSH 私钥的格式错误文件处理
将集成测试重写为 JUnit5
合并 #851:修复密钥交换中的竞争条件,导致间歇性 SSH_MSG_UNIMPLMENTED
合并 #861:添加 DefaultSecurityProviderConfig 并禁用 BouncyCastle
合并 #881:将测试类重写为 JUnit Jupiter 引擎
合并 #880:删除了 Java 7 向后移植 Socket 实用程序
合并#879:用 java.util.Base64 替换自定义 Base64
合并#852:删除未使用的 bcrypt 密码哈希方法
合并 #874:Java 8 最低版本 + 依赖项升级
合并#876:更改newStatefulSFTPClient
以返回StatefulSFTPClient
合并#860:升级到 Gradle 7.6.1
合并#838:用 X25519 密钥协议替换 Curve25519 类
合并 #772:删除对 jzlib 的依赖
合并 #835:改进了 TimeoutException 消息
合并#815:在 FreeBSD 上支持 authPassword
合并#813:防止 isOpen 和 write 调用之间的CHANNEL_CLOSE
。
合并 #811:添加Transport.isKeyExchangeREquired
以防止不必要的 KEXINIT
合并 #743:使用 AuthGssApiWithMic 的默认客户端凭据
合并#801:捕获InterruptedException后恢复线程中断状态
合并 #793:合并 PKCS5 和 PKCS8 类
升级依赖SLF4J(1.7.36)和Logback(1.2.11)
合并#791:更新 KeepAlive 示例
合并#775:添加 SFTP 恢复支持
升级依赖 BouncyCastle (1.70)
合并#687:远程关闭连接时正确关闭连接。
合并#741:在测试设置中添加对测试容器的支持以测试更多场景
合并 #733:如果客户端知道 CA 密钥,则发送正确的密钥提议
合并 #746:修复使用密码读取 Putty 私钥文件时的错误
合并 #742:使用 Config.keyAlgorithms 确定 rsa-sha2 支持
合并 #754:使用 SFTP 协议版本有条件地设置 FXP 重命名标志
合并#752:正确启动和终止 KeepAlive 线程
合并#753:提供更好的线程名称
合并#724:添加参数以限制预读长度
合并 #763:尝试特定密钥类型的所有公钥算法
合并 #756:删除已弃用的代理连接方法
合并 #770:添加对ed25519
aes-128-cbc
密钥的支持
合并#773:修复读取空 OpenSSHKeyV1KeyFile 时的 NPE
合并#777:不要请求太多预读数据包
在通道关闭时发送 EOF(修复 #143、#496、#553、#554)
合并 #726:解析具有完整 CRT 信息的 OpenSSH v1 密钥
合并#721:首选已知主机密钥算法进行主机密钥验证
合并#716、#729 和#730:添加对 PuTTY v3 密钥文件的完全支持。
合并 #708 和 #71:添加对 PKCS#8 私钥的支持
合并#703:支持主机证书密钥
升级依赖 BouncyCastle (1.69)、SLF4j (1.7.32)、Logback (1.2.6)、asn-one (0.6.0)
合并#702:支持使用证书的公钥身份验证
合并 #691:修复将负无符号整数写入缓冲区的问题
合并#682:支持 [email protected] 密码
合并#680:可配置 SCP 传输的保留时间
凹凸依赖项(asn-one 0.5.0、BouncyCastle 1.68、slf4j-api 1.7.30)
合并#660:支持 PuTTY 格式的 ED25519 和 ECDSA 密钥
合并#655:由于 CVE 影响 BouncyCastle
合并 #653:使参数类可用作 HashMap 键
合并#647:降低识别解析器的日志级别
合并 #630:添加对[email protected]
和[email protected]
密码的支持
合并#636:改进了 Android 兼容性
合并#627:防止密钥泄漏
重大更改:从配置中删除了setSignatureFactories
和getSignatureFactories
,并将它们切换为getKeyAlgorithms
和setKeyAlgorithms
修复 #588:添加对ssh-rsa2-256
和ssh-rsa2-512
签名的支持
合并#579:修复 OpenSSHKnownHosts 中的 NPE
合并 #587:为 OpenSSHKeyV1KeyFile 添加密码查找器重试
合并#586:使 KeyType 与 Android Store 兼容
合并 #593:将UserAuth.getAllowedMethods()
更改为 Collection 返回类型
合并#595:允许读取任意长度的密钥
合并#591:允许查询 SFTP 扩展
合并#603:添加创建有状态 SFTP 客户端的方法
合并#605:使用守护线程来避免阻塞 JVM 关闭
合并#606:默认情况下始终使用 JCERandom RNG
合并#609:使用后清除密码以防止安全问题
合并 #618:修复 DirectConnection 的本地端口以与 OpenSSH > 8.0 一起使用
合并#619:将 BouncyCastle 升级到 1.66
合并#622:使用 KEX 算法发送“ext-info-c”
合并#623:修复nistp521
签名的传输编码
合并#607:修复关键算法的数学公钥
合并#602:修复 RSA 证书密钥确定
已修复 #415:修复了 SFTPClient.mkdirs 中路径的错误前缀“/”
添加了对 ETM(Encrypt-then-Mac)MAC 算法的支持。
修复了 #454:添加了 Buffer.putUint64 缺少容量检查
修复 #466:为远程操作添加锁定超时以防止挂起
修复 #470:将 EdDSA 设为默认(第一个)签名工厂
修复 #467:在 openssh-key-v1 支持中添加 AES256-CBC 作为密码模式
修复 #464:在 DefaultConfig 中启用 [email protected]
修复 #472:处理服务器发起的全局请求
修复了 #485:在 openssh-key-v1 密钥文件中添加了对所有密钥类型的支持。
修复了 #413:对 PrivateKeyFileResource 使用 UTF-8
修复 #427:支持加密的 ed25519 openssh-key-v1 文件
BouncyCastle 升级至 1.60
添加了对 [email protected] MAC 的支持
添加了对 hmac-ripemd160 的支持
修复 #382:修复了 WildcardHostmatcher 中的转义问题
添加了使用 Docker 针对 OpenSSH 的集成测试套件
修复了 #187:Buffer.putString 中的固定长度错误
修复了 #405:如果第一个主机密钥不匹配,则继续主机验证。
合并#372:升级到“net.i2p.crypto:eddsa:0.2.0”
修复了 #355 和 #354:正确解码签名字节
修复 #365:添加了对服务器密钥的新型 OpenSSH 指纹的支持
修复 #356:修复了 ECDSA 公钥的密钥类型检测
兼容 SSHJ Java9
修复 #341:修复了递归复制期间的路径行走
合并#338:添加 ConsolePasswordFinder 以从标准输入读取密码
合并 #336:添加了对 ecdsa-sha2-nistp384 和 ecdsa-sha2-nistp521 签名的支持
修复 #331:添加了对known_hosts 文件中通配符的支持
合并 #322:修复 40f956b 的回归(输出流上的长度参数无效)
合并 #319:添加了对[email protected]
和[email protected]
证书密钥文件的支持
将 Gradle 升级到 3.4.1
合并#305:添加了对自定义字符串编码的支持
修复 #312:将 BouncyCastle 升级到 1.56
合并#294:通过常量而不是名称引用 ED25519
合并#293、#295 和#301:修复了 OSGi 打包
添加了新的 Diffie Hellman 组 15-18 以实现更强大的 KeyExchange 算法
在 DefaultConfig 中启用 PKCS5 密钥文件
合并#291:修复了 sshj.properties 加载和链接异常消息
合并#284:正确捕获 keepalive 线程中的中断
修复 #292:将配置的 RandomFactory 传递给 Diffie Hellman KEX
修复了 #256:如果不存在 git 存储库,SSHJ 现在会构建
LocalPortForwarder 现在可以在 close() 上正确中断其自己的线程
修复 #276:添加对 ed-25519 和新 OpenSSH 密钥格式的支持
修复了 #280:从生成的 sshj.properties 文件中读取版本,以便在协商期间正确输出版本
修复了 Android 兼容性问题
升级到Gradle 3.0
合并#271:加载known_hosts而不需要BouncyCastle
合并#269:根据大众需求恢复了 Java6 支持
合并#267:添加了对每个连接日志记录的支持(修复#264)
合并#262、#265 和#266:添加了 PKCS5 密钥文件支持
修复了 sftp FileAttributes 的 toString(修复 #258)
修复 #255:不再依赖于net.i2p.crypto.eddsa.math
包中的“私有标记”类,修复了 OSGI 依赖关系
宽松地对待以“n”而不是“rn”结尾的 SSH 服务器标识行。
改进了 SSH 服务器标识的解析。太长的标题行现在不再破坏协议。
在 SFTP 复制行为中引入了重大更改:以前,如果源和目标都是具有不同名称的文件夹,则 SFTP 复制操作的行为会有所不同。在这种情况下,目录本身被复制为目标目录的子目录,而不是将源的内容复制到目标目录中。此行为已被删除,取而代之的是默认行为,即将源的内容复制到目标中。使行为符合 SCP 的工作方式。
修复#252(来自:#253):同名子目录不再被意外合并
修复了 #239:如果您使用空字符串作为地址或包罗万象的地址,则远程端口转发不起作用。
修复了 #242:将 OSGI 标头添加到源 jar 清单中
已修复 #236:使用动态端口分配的远程端口转发失败并出现 BufferUnderflowException
将 gradle 发行版升级到 2.12
已关闭 #234:放弃了 Java6 支持(由于 Java7 依赖性,0.15.0 已经与 Java6 不兼容)
修复 #118:添加了用于在发送客户端标识之前等待服务器标识的配置开关。
修复了 #114:添加了 javadoc,在检查退出代码之前,您始终需要在命令上调用 close()。
已修复 #237:修复了成功身份验证后直接收到[email protected]
全局请求时的竞争条件。
修复 #220:添加了对ssh-ed25519
主机密钥的支持
已修复 #225:修复了 ECDSA 指纹计算中有时会产生不正确指纹的错误
添加了来自 RFC4253 和 RFC4345 的arcfour
流密码
添加了 RFC4344 和 RFC4253 中的所有分组密码
修复 #171:添加了对[email protected]
密钥交换算法的支持
添加了对ecdh-sha2-nistp256
、 ecdh-sha2-nistp384
和ecdh-sha2-nistp521
密钥交换算法的支持
修复 #167:添加了对diffie-hellman-group-exchange-sha1
和diffie-hellman-group-exchange-sha256
密钥交换方法的支持
修复 #212:配置路径转义以使 shell 扩展能够正常工作
合并#210:RemoteFileInputStream.skip 返回错误值(修复#209)
合并#208:添加了 SCP 带宽限制支持
合并#211:使密钥文件格式检测更加稳健
合并 #199:修复 ReadAheadRemoteFileInputStream 中的 IndexOutOfBoundsException,修复 #183
合并#195:支持新的身份验证: gssapi-with-mic
合并#201:验证协商密钥交换算法的新选项
合并#196:修复在已知主机文件中查找完整主机名的问题
添加了运行 JDK6 或 JDK7 时对 HTTP 代理的支持,修复:#170
合并#186:修复检测流结束
编译到 JDK6,修复 #179 和 #185
当 LocalPortForwarder 无法打开和启动通道时,正确关闭套接字和通道(修复 #175 和 #176)
合并#181:使用偏移量读取时写入数据包长度无效(修复#180)
新的 Maven 坐标com.hierynomus:sshj:0.11.0
@hierynomus 接任 SSHJ 的维护者
将构建系统迁移到 Gradle 2.2.1
合并#150:修复了某些 SSH 服务器上不正确的文件句柄,修复:#54、#119、#168、#169
使jzlib
在 OSGi 捆绑中成为可选,修复:#162
改进了一些日志级别,修复:#161
合并#156、#164、#165:修复了hmac-sha2-256
和hmac-sha2-512
的块大小
合并#141:添加代理支持
合并#157、#163:文档和构建修复
将 BouncyCastle 升级到 1.51,修复:#142
通过连接丢失检测实现保持活动状态,修复#166