Advertencia | Las versiones de SSHJ hasta la 0.37.0 inclusive son vulnerables a CVE-2023-48795 - Terrapin. Actualice a 0.38.0 o superior. |
Para empezar, eche un vistazo a uno de los ejemplos. Esperemos que le resulte agradable trabajar con la API :)
Para obtener SSHJ, tienes dos opciones:
Agregue una dependencia a SSHJ a su proyecto.
Construya SSHJ usted mismo.
Y, si lo deseas, también puedes ejecutar los ejemplos de SSHJ.
Las versiones binarias de SSHJ no se proporcionan aquí, pero puede descargarlas directamente desde el repositorio central de Maven si lo desea.
Si está compilando su proyecto usando Maven, puede agregar la siguiente dependencia a pom.xml
:
< dependency >
< groupId >com.hierynomus</ groupId >
< artifactId >sshj</ artifactId >
< version >0.38.0</ version >
</ dependency >
Si su proyecto se compila utilizando otra herramienta de compilación que utiliza el repositorio central de Maven, traduzca esta dependencia al formato utilizado por su herramienta de compilación.
Clona el repositorio SSHJ.
Asegúrese de tener Java6 instalado con las extensiones de criptografía Java (JCE) ilimitadas.
Ejecute el comando ./gradlew clean build
.
En el directorio examples
, hay un proyecto Maven independiente que muestra cómo se puede utilizar la biblioteca en algunos casos de muestra. Si desea ejecutarlos, siga estas pautas:
Instale Maven 2.2.1 o superior.
Clona el repositorio SSHJ.
Vaya al directorio examples
y ejecute el comando mvn eclipse:eclipse
.
Importe el proyecto examples
a Eclipse.
Cambie los detalles de inicio de sesión en las clases de ejemplo (dirección, nombre de usuario y contraseña) y ejecútelas.
leer archivosknown_hosts para verificar la clave del host
clave pública, contraseña y autenticación interactiva con teclado
canales de comando, subsistema y shell
reenvío de puertos locales y remotos
scp + implementación completa de sftp versión 0-3
Se incluyen implementaciones/adaptadores para los siguientes algoritmos:
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 también admite los siguientes cifrados extendidos (no oficiales): 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-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 también admite los siguientes algoritmos de intercambio de claves extendidos (no oficiales): `[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
y [email protected]
(zlib retrasado)
pkcs5
, pkcs8
, openssh-key-v1
, [email protected]
, [email protected]
Si necesita algo que no esté incluido, no debería ser demasiado difícil agregarlo (¡contribuya!)
Comparación de implementación de SSH
Java 8 o superior
SLF4J 2.0.0
Castillo Hinchable
Rastreador de problemas: https://github.com/hierynomus/sshj/issues
¡Bifurcación!
CVE-2023-48795 mitigado: Terrapin
Fusionado #917: Implementar la extensión estricta de intercambio de claves OpenSSH
° 903 fusionado: solución para escribir cadenas de claves de hosts conocidos
° 913 fusionado: evitar que los buffers de reenvío de puertos remotos crezcan sin límites
Pruebas movidas a JUnit5
Fusionado #827: respaldo a la extensión [email protected] si está disponible
° 904 fusionado: agregue compatibilidad con ChaCha20-Poly1305 para claves OpenSSH
Fusionado #899: Agregar soporte para claves privadas AES-GCM OpenSSH
Fusionado #901: Corregir error de compresión ZLib
Fusionado #898: Manejo mejorado de archivos con formato incorrecto para claves privadas de OpenSSH
Se reescribieron las pruebas de integración en JUnit5
° 851: se corrigió la condición de carrera en el intercambio de claves que causaba SSH_MSG_UNIMPLEMENTED intermitente
° 861: Agregar DefaultSecurityProviderConfig con BouncyCastle deshabilitado
° 881 fusionado: clases de prueba reescritas en el motor JUnit Jupiter
Fusionado #880: Se eliminaron las utilidades de socket del backport de Java 7
Fusionado #879: Base64 personalizado reemplazado con java.util.Base64
Fusionado #852: Se eliminaron los métodos de hash de contraseñas de bcrypt no utilizados
Fusionado #874: versión mínima de Java 8 + actualizaciones de dependencia
° 876: cambie newStatefulSFTPClient
para devolver StatefulSFTPClient
° 860 fusionado: actualización a Gradle 7.6.1
Fusionado #838: Se reemplazó la clase Curve25519 con el acuerdo de clave X25519
° 772 fusionado: eliminar la dependencia de jzlib
° 835 combinado: mensaje TimeoutException mejorado
Fusionado #815: Soporte authPassword en FreeBSD
Fusionado #813: Evitar CHANNEL_CLOSE
entre isOpen y la llamada de escritura.
° 811 combinado: agregue Transport.isKeyExchangeREquired
para evitar KEXINIT innecesario
Combinado #743: Usar credenciales de cliente predeterminadas para AuthGssApiWithMic
° 801 fusionado: restaurar el estado de interrupción del subproceso después de detectar InterruptedException
Fusionado #793: Fusionar las clases PKCS5 y PKCS8
Dependencias mejoradas SLF4J (1.7.36) y Logback (1.2.11)
Combinado #791: Actualizar ejemplos de KeepAlive
Fusionado #775: Agregar soporte para currículum SFTP
Dependencias mejoradas BouncyCastle (1.70)
Fusionado #687: Cerrar correctamente la conexión cuando el control remoto cierra la conexión.
° 741 combinado: agregue soporte para contenedores de prueba en la configuración de prueba para probar más escenarios
° 733 combinado: envíe la propuesta de clave correcta si el cliente conoce la clave de CA
Fusionado #746: Corrección de error al leer el archivo de clave privada de Putty con frase de contraseña
° 742 combinado: use Config.keyAlgorithms para determinar la compatibilidad con rsa-sha2
° 754 fusionado: use la versión del protocolo SFTP para configurar los indicadores de cambio de nombre de FXP de manera condicional
° 752: iniciar y finalizar correctamente el hilo KeepAlive
° 753 combinado: proporcionar mejores nombres de subprocesos
Combinado #724: Agregar parámetro para limitar la longitud de lectura anticipada
° 763 combinado: pruebe todos los algoritmos de clave pública para un tipo de clave específico
° 756 fusionado: eliminar métodos de conexión de proxy obsoletos
Fusionado #770: Agregar soporte para claves ed25519
aes-128-cbc
° 773: corrige NPE al leer OpenSSHKeyV1KeyFile vacío
° 777 combinado: no solicite demasiados paquetes de lectura anticipada
Enviar EOF al cerrar el canal (Correcciones #143, #496, #553, #554)
° 726: analizar claves OpenSSH v1 con información CRT completa presente
° 721 fusionado: prefiere un algoritmo de clave de host conocido para la verificación de la clave de host
Fusionados #716, #729 y #730: agregue soporte completo para archivos de claves PuTTY v3.
Fusionados #708 y #71: agregar soporte para claves privadas PKCS#8
° 703 fusionado: claves de certificado de host de soporte
Dependencias mejoradas BouncyCastle (1.69), SLF4j (1.7.32), Logback (1.2.6), asn-one (0.6.0)
Fusionado #702: Admite autenticación de clave pública mediante certificados
° 691: solución para escribir enteros negativos sin signo en el búfer
Fusionado #682: Soporte para cifrado [email protected]
Fusionado #680: Preservar mtimes configurables para transferencias SCP
Dependencias de aumento (asn-one 0.5.0, BouncyCastle 1.68, slf4j-api 1.7.30)
° 660 combinado: admite claves ED25519 y ECDSA en formato PuTTY
Fusionado #655: Bump BouncyCastle debido a CVE
° 653: hacer que la clase de parámetros se pueda utilizar como clave HashMap
° 647 combinado: reducir el nivel de registro para el analizador de identificación
Fusionado #630: Agregar soporte para cifrados [email protected]
y [email protected]
° 636 combinado: compatibilidad mejorada con Android
Fusionado #627: Evitar la fuga de claves
CAMBIO IMPORTANTE : Se eliminaron setSignatureFactories
y getSignatureFactories
de la configuración y se cambiaron por getKeyAlgorithms
y setKeyAlgorithms
Corregido #588: Agregar soporte para firmas ssh-rsa2-256
y ssh-rsa2-512
Fusionado #579: Arreglar NPE en OpenSSHKnownHosts
Fusionado #587: Agregar reintento del buscador de contraseñas para OpenSSHKeyV1KeyFile
° 586 fusionado: hacer que KeyType sea compatible con la tienda de Android
Combinado #593: Cambie UserAuth.getAllowedMethods()
al tipo de retorno de Colección
° 595 combinado: permitir la lectura de claves de longitud arbitraria
Fusionado #591: Permitir consultar extensiones SFTP
Fusionado #603: Agregar método para crear un cliente SFTP con estado
° 605 combinado: utilice subprocesos de Daemon para evitar bloquear el cierre de JVM
° 606 combinado: utilice siempre JCERandom RNG de forma predeterminada
° 609 fusionado: borrar la frase de contraseña después de su uso para evitar problemas de seguridad
Fusionado #618: Reparar el puerto local de DirectConnection para usar con OpenSSH > 8.0
Fusionado #619: BouncyCastle actualizado a 1.66
Fusionado #622: Enviar 'ext-info-c' con algoritmos KEX
° 623: se corrigió la codificación de transporte de las firmas nistp521
° 607 fusionado: corregir las claves públicas matemáticas en algoritmos clave
Fusionado #602: Arreglar la determinación de la clave del certificado RSA
Corregido #415: Se corrigió el prefijo '/' incorrecto en la ruta en SFTPClient.mkdirs
Se agregó soporte para algoritmos MAC ETM (Encrypt-then-Mac).
Corregido #454: Se agregó verificación de capacidad faltante para Buffer.putUint64
Corregido #466: Se agregó tiempo de espera de bloqueo para acción remota para evitar que se cuelgue
Corregido #470: EdDSA se convirtió en la (primera) fábrica de firmas predeterminada
Corregido #467: Se agregó AES256-CBC como modo de cifrado en soporte de openssh-key-v1
Corregido #464: [email protected] habilitado en DefaultConfig
Corregido #472: Manejar solicitudes globales iniciadas por el servidor
Corregido #485: Se agregó soporte para todos los tipos de claves a los archivos de claves openssh-key-v1.
Corregido #413: Use UTF-8 para PrivateKeyFileResource
Corregido #427: Admite archivos cifrados ed25519 openssh-key-v1
Castillo hinchable actualizado a 1.60
Se agregó soporte para [email protected] MAC
Se agregó soporte para hmac-ripemd160
Corregido #382: Se corrigió el escape en WildcardHostmatcher
Se agregó un conjunto de pruebas de integración usando Docker contra OpenSSH.
Corregido #187: Error de longitud fija en Buffer.putString
Corregido #405: Continuar la verificación del host si la primera clave de host no coincide.
Fusionado #372: Actualizar a 'net.i2p.crypto:eddsa:0.2.0'
Se corrigieron los números 355 y 354: decodificar correctamente los bytes de firma
Corregido #365: Se agregó soporte para huellas digitales OpenSSH de nuevo estilo de claves de servidor
Corregido #356: Detección de tipo de clave fija para claves públicas ECDSA
Compatible con SSHJ Java9
Corregido #341: Ruta de acceso fija durante la copia recursiva
Fusionado #338: Se agregó ConsolePasswordFinder para leer la contraseña desde la entrada estándar
Fusionado #336: Se agregó soporte para firmas ecdsa-sha2-nistp384 y ecdsa-sha2-nistp521
Corregido #331: Se agregó soporte para comodines en el archivo conocido_hosts
Combinado #322: Se corrigió la regresión de 40f956b (parámetro de longitud no válido en el flujo de salida)
Fusionado #319: Se agregó soporte para archivos de claves de certificado [email protected]
y [email protected]
Gradle actualizado a 3.4.1
Fusionado #305: Se agregó soporte para codificación de cadenas personalizadas
Corregido #312: BouncyCastle actualizado a 1.56
Combinado #294: Referencia ED25519 por constante en lugar de nombre
Fusionados #293, #295 y #301: empaquetado OSGi fijo
Se agregaron nuevos grupos Diffie Hellman 15-18 para algoritmos KeyExchange más sólidos.
Archivos de clave PKCS5 habilitados en DefaultConfig
Fusionado #291: Se corrigió la carga de sshj.properties y mensajes de excepción encadenados
° 284: capturar correctamente la interrupción en el hilo keepalive
Corregido #292: Pasar el RandomFactory configurado a Diffie Hellman KEX
Corregido #256: SSHJ ahora se compila si no hay un repositorio git presente
LocalPortForwarder ahora interrumpe correctamente su propio hilo al cerrar()
Corregido #276: Agregar soporte para ed-25519 y nuevo formato de clave OpenSSH
Corregido #280: Leer la versión de un archivo sshj.properties generado para generar correctamente la versión durante la negociación
Compatibilidad fija con Android
Actualice a Gradle 3.0
Fusionado #271: Cargar hosts_conocidos sin requerir BouncyCastle
Fusionado #269: Se recuperó el soporte para Java6 por demanda popular
Fusionado #267: Se agregó soporte para el registro por conexión (Correcciones #264)
Fusionados #262, #265 y #266: Se agregó compatibilidad con archivos de claves PKCS5
Se corrigió la cadena de atributos de archivo sftp (correcciones n.° 258)
Corregido #255: Ya no depende de las clases 'marcadas de forma privada' en el paquete net.i2p.crypto.eddsa.math
, corrige las dependencias OSGI
Tratar con indulgencia la línea de identificación del servidor SSH que termina en 'n' en lugar de 'rn'.
Análisis mejorado de la identificación del servidor SSH. Las líneas de encabezado demasiado largas ya no violan el protocolo.
Se introdujo un cambio importante en el comportamiento de copia SFTP : anteriormente, una operación de copia SFTP se comportaría de manera diferente si tanto el origen como el destino fueran carpetas con nombres diferentes. En este caso, en lugar de copiar el contenido del origen en el directorio de destino, el directorio en sí se copió como un subdirectorio del directorio de destino. Este comportamiento se ha eliminado en favor del comportamiento predeterminado que consiste en copiar el contenido del origen en el destino. Alinear el comportamiento con el funcionamiento de SCP.
Corregido #252 (vía: #253): Los subdirectorios del mismo nombre ya no se fusionan por accidente
° 239: los reenvíos de puertos remotos no funcionaban si usaba la cadena vacía como dirección o una dirección general.
Corregido #242: Se agregaron encabezados OSGI al manifiesto jar de fuentes
Corregido #236: El reenvío de puerto remoto con asignación dinámica de puerto falla con BufferUnderflowException
Distribución gradle actualizada a 2.12
Cerrado #234: Se eliminó la compatibilidad con Java6 (0.15.0 ya era incompatible con Java6 debido a la dependencia de Java7)
Corregido #118: Se agregó un interruptor de configuración para esperar en una identificación del servidor antes de enviar la identificación del cliente.
Corregido #114: Se agregó javadoc que siempre necesita llamar a close() en un comando antes de inspeccionar los códigos de salida.
Corregido #237: Se corrigió la condición de carrera si se recibe una solicitud global [email protected]
directamente después de una autenticación exitosa.
Corregido #220: Se agregó soporte para claves de host ssh-ed25519
Corregido #225: Se corrigió un error en el cálculo de huellas dactilares de ECDSA que a veces producía una huella digital incorrecta
Se agregaron arcfour
Stream Ciphers de RFC4253 y RFC4345.
Se agregaron todos los cifrados de bloque de RFC4344 y RFC4253.
Corregido #171: Se agregó soporte para el algoritmo de intercambio de claves [email protected]
Se agregó soporte para los algoritmos de intercambio de claves ecdh-sha2-nistp256
, ecdh-sha2-nistp384
y ecdh-sha2-nistp521
Corregido #167: Se agregó soporte para los métodos de intercambio de claves diffie-hellman-group-exchange-sha1
y diffie-hellman-group-exchange-sha256
Corregido #212: Configure el escape de ruta para permitir que la expansión del shell funcione correctamente
Combinado #210: RemoteFileInputStream.skip devuelve un valor incorrecto (Correcciones #209)
Fusionado #208: Se agregó soporte de limitación de ancho de banda de SCP
Fusionado #211: Se hizo más robusta la detección del formato de archivos de claves
Combinado #199: Corrección para IndexOutOfBoundsException en ReadAheadRemoteFileInputStream, correcciones #183
Fusionado #195: Nueva autenticación admitida: gssapi-with-mic
Fusionado #201: Nueva opción para verificar algoritmos de intercambio de claves negociados
° 196: solución para buscar el nombre de host completo en un archivo de hosts conocido
Se agregó soporte para servidores proxy HTTP cuando se ejecuta JDK6 o JDK7, correcciones: #170
Combinado #186: Solución para detectar el final de la transmisión
Compilando en JDK6, corrige #179 y #185
Cierre correctamente el socket y el canal cuando LocalPortForwarder no pueda abrir e iniciar el canal (Correcciones n.° 175 y n.° 176)
Combinado #181: Longitud de paquete de escritura no válida al leer con desplazamiento (Correcciones #180)
El nuevo maven coordina com.hierynomus:sshj:0.11.0
cuando @hierynomus asumió el cargo de mantenedor de SSHJ
Sistema de compilación migrado a Gradle 2.2.1
Combinado #150: Corrección del manejo de archivos incorrecto en algunos servidores SSH, correcciones: #54, #119, #168, #169
jzlib
se hizo opcional en el paquete OSGi, correcciones: #162
Se mejoraron algunos niveles de registro, correcciones: #161
Fusionado #156, #164, #165: tamaños de bloque fijos para hmac-sha2-256
y hmac-sha2-512
Fusionado #141: Agregar soporte de proxy
Fusionado #157, #163: Correcciones de documentación y compilación
BouncyCastle actualizado a 1.51, correcciones: #142
Se implementó keep-alive con detección de caída de conexión, correcciones #166