
jsch jsch-2.28.7
fork de la popular biblioteca jsch
Fork de JSch-0.1.55
Ver el README original
¿Por qué deberías usar esta librería?
Como expliqué en un artículo de blog, los puntos principales son:
- OpenSSH ha deshabilitado ssh-rsa en la versión 8.8 por defecto y necesitas una librería que admita rsa-sha2-256 y rsa-sha2-512.
- Reemplazo directo: solo cambia las coordenadas de dependencia y ya estás listo.
- No hay mantenimiento activo de JSch en SourceForge.
- Se mantiene al día con las características de OpenJDK, por lo que no se necesitan dependencias adicionales.
¿Hay documentación?
No mucha. Revisa el código de ejemplo en la carpeta examples. Y hay algunas páginas wiki, es decir, Jsch-Configuration y Jsch-Logging.
Versionado
Hasta 0.2.26, el versionado seguía el esquema original de jsch; a partir de 2.27.0, cambiamos al versionado semántico, lo que expresa que la API de la librería es estable y se usa en producción.
Cómo usar esta librería como reemplazo de com.jcraft:jsch
Asegúrate de tener solo una dependencia de jsch en tu classpath. Por ejemplo, puedes comprobar la salida de mvn dependency:tree.
reemplazando una dependencia directa de Maven
reemplaza
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
con
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>2.28.0</version>
</dependency>
reemplazando jsch como dependencia transitiva de Maven
Cuando tienes un artefacto foo:bar, que contiene com.jcraft:jsch como dependencia transitiva, necesitas añadir com.github.mwiede:jsch como otra dependencia y excluir la de jcraft:
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>2.28.0</version>
</dependency>
<dependency>
<groupId>foo</groupId>
<artifactId>bar</artifactId>
<exclusions>
<exclusion>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
</exclusion>
</exclusions>
</dependency>
Adición: También puedes excluir cualquiera de com.jcraft:jsch.agentproxy.jsch, com.jcraft:jsch.agentproxy.core o com.jcraft:jsch.agentproxy.pageant, porque estos módulos se integraron en este fork (consulta las notas de la versión 0.1.66).
Preguntas frecuentes
¿Cuál es la versión mínima de Java requerida?
- Java 8. Para más limitaciones, consulta la siguiente respuesta.
¿Se admiten ssh-ed25519, ssh-ed448, curve25519-sha256, curve448-sha512 y chacha20-poly1305@openssh.com?
- Esta librería es un Multi-Release-jar, lo que significa que solo puedes usar ciertas funciones cuando se utiliza una versión más reciente de Java.
- Para usar ssh-ed25519 y ssh-ed448, debes utilizar al menos Java 15 o añadir Bouncy Castle (bcprov-jdk18on) al classpath.
- Para usar curve25519-sha256 y curve448-sha512, debes utilizar al menos Java 11 o añadir Bouncy Castle (bcprov-jdk18on) al classpath.
- Para usar chacha20-poly1305@openssh.com, debes añadir Bouncy Castle (bcprov-jdk18on) al classpath.
- A partir de la versión 0.1.66, estos algoritmos ahora se pueden usar con versiones anteriores de Java si se añade Bouncy Castle (bcprov-jdk18on) al classpath.
- A partir de la versión 0.1.72, chacha20-poly1305@openssh.com solo se puede usar si se añade Bouncy Castle (bcprov-jdk18on) al classpath.
¿Por qué las claves de tipo ssh-rsa no funcionan con este fork de JSch y mi servidor?
- A partir de la versión 0.2.0, el algoritmo de firma RSA/SHA1 está deshabilitado por defecto.
- SHA1 ya no se considera seguro por parte de la comunidad criptográfica general, y este fork de JSch se esfuerza por mantener opciones seguras para los algoritmos predeterminados que utilizará.
- Esto también sigue el ejemplo del proyecto OpenSSH, que deshabilitó las firmas RSA/SHA1 por defecto a partir de la versión 8.8 de OpenSSH.
- Las claves de tipo ssh-rsa siguen funcionando por defecto con los algoritmos de firma RSA/SHA256 (rsa-sha2-256) y RSA/SHA512 (rsa-sha2-512) definidos por RFC 8332.
- Si tu servidor solo admite firmas RSA/SHA1 y necesitas usarlas en tu aplicación, tendrás que volver a habilitarlas manualmente mediante uno de los siguientes medios (consulta también la página wiki Jsch-Configuration):
- Globalmente, añadiendo "ssh-rsa" a las propiedades
jsch.server_host_key+jsch.client_pubkey. - Globalmente, ejecutando algo similar a
JSch.setConfig("server_host_key", JSch.getConfig("server_host_key") + ",ssh-rsa")+JSch.setConfig("PubkeyAcceptedAlgorithms", JSch.getConfig("PubkeyAcceptedAlgorithms") + ",ssh-rsa"). - Por sesión, ejecutando algo similar a
session.setConfig("server_host_key", session.getConfig("server_host_key") + ",ssh-rsa")+session.setConfig("PubkeyAcceptedAlgorithms", session.getConfig("PubkeyAcceptedAlgorithms") + ",ssh-rsa"). - Añadiendo "ssh-rsa" a tu archivo de configuración de tipo OpenSSH con las palabras clave "HostKeyAlgorithms" + "PubkeyAcceptedAlgorithms" y luego utilizando la clase
OpenSSHConfig.
- Globalmente, añadiendo "ssh-rsa" a las propiedades
¿Es este fork 100% compatible con el JSch original? ¡Porque la conexión a mi servidor ya no funciona!
- Para la compatibilidad con OpenSSH y una mayor seguridad, se cambió el orden de los algoritmos criptográficos. Si aún quieres usar algoritmos más antiguos u obsoletos, necesitas cambiar la configuración. Ejemplos: ver #37, #40
- Para que sea más fácil ajustar los algoritmos criptográficos, a partir de 0.1.65 se pueden establecer las siguientes propiedades del sistema al iniciar tu aplicación:
jsch.kex- análogo a
JSch.setConfig("kex", "...")
- análogo a
jsch.server_host_key- análogo a
JSch.setConfig("server_host_key", "...")
- análogo a
jsch.prefer_known_host_key_types- análogo a
JSch.setConfig("prefer_known_host_key_types", "...")
- análogo a
jsch.enable_server_sig_algs- análogo a
JSch.setConfig("enable_server_sig_algs", "...")
- análogo a
jsch.cipher- análogo a
JSch.setConfig("cipher.s2c", "...")+JSch.setConfig("cipher.c2s", "...")
- análogo a
jsch.mac- análogo a
JSch.setConfig("mac.s2c", "...")+JSch.setConfig("mac.c2s", "...")
- análogo a
jsch.compression- análogo a
JSch.setConfig("compression.s2c", "...")+JSch.setConfig("compression.c2s", "...")
- análogo a
jsch.lang- análogo a
JSch.setConfig("lang.s2c", "...")+JSch.setConfig("lang.c2s", "...")
- análogo a
jsch.dhgex_min- análogo a
JSch.setConfig("dhgex_min", "...")
- análogo a
jsch.dhgex_max- análogo a
JSch.setConfig("dhgex_max", "...")
- análogo a
jsch.dhgex_preferred- análogo a
JSch.setConfig("dhgex_preferred", "...")
- análogo a
jsch.compression_level- análogo a
JSch.setConfig("compression_level", "...")
- análogo a
jsch.preferred_authentications- análogo a
JSch.setConfig("PreferredAuthentications", "...")
- análogo a
jsch.client_pubkey- análogo a
JSch.setConfig("PubkeyAcceptedAlgorithms", "...")
- análogo a
jsch.check_ciphers- análogo a
JSch.setConfig("CheckCiphers", "...")
- análogo a
jsch.check_macs- análogo a
JSch.setConfig("CheckMacs", "...")
- análogo a
jsch.check_kexes- análogo a
JSch.setConfig("CheckKexes", "...")
- análogo a
jsch.check_signatures- análogo a
JSch.setConfig("CheckSignatures", "...")
- análogo a
jsch.fingerprint_hash- análogo a
JSch.setConfig("FingerprintHash", "...")
- análogo a
jsch.max_auth_tries- análogo a
JSch.setConfig("MaxAuthTries", "...")
- análogo a
Otros proyectos que usan JSch
- Jsync https://github.com/fizzed/jsync - Proporciona una herramienta de sincronización de archivos y directorios simple, eficiente, confiable y en Java puro, similar a rsync, que puede usarse programáticamente.
- Blaze https://github.com/fizzed/blaze - Una forma de ejecutar archivos Java como scripts, con potentes funciones SSH, SFTP y similares a rsync integradas.
Cambios desde el fork:
Consulta ChangeLog.md