Aviso | Versões SSHJ até 0.37.0 inclusive são vulneráveis a CVE-2023-48795 - Terrapin. Atualize para 0.38.0 ou superior. |
Para começar, dê uma olhada em um dos exemplos. Esperamos que você ache a API agradável de trabalhar :)
Para obter SSHJ, você tem duas opções:
Adicione uma dependência de SSHJ ao seu projeto.
Construa o SSHJ você mesmo.
E, se quiser, você também pode executar os exemplos SSHJ.
Versões binárias do SSHJ não são fornecidas aqui, mas você pode baixá-las diretamente do repositório Maven Central, se desejar.
Se estiver construindo seu projeto usando Maven, você pode adicionar a seguinte dependência ao pom.xml
:
< dependency >
< groupId >com.hierynomus</ groupId >
< artifactId >sshj</ artifactId >
< version >0.38.0</ version >
</ dependency >
Se o seu projeto for compilado usando outra ferramenta de build que usa o repositório Maven Central, converta essa dependência no formato usado pela sua ferramenta de build.
Clone o repositório SSHJ.
Certifique-se de ter o Java6 instalado com Java Cryptography Extensions (JCE) de força ilimitada.
Execute o comando ./gradlew clean build
.
No diretório examples
, há um projeto Maven separado que mostra como a biblioteca pode ser usada em alguns casos de exemplo. Se você quiser executá-los, siga estas diretrizes:
Instale o Maven 2.2.1 ou superior.
Clone o repositório SSHJ.
Vá para o diretório examples
e execute o comando mvn eclipse:eclipse
.
Importe o projeto examples
para o Eclipse.
Altere os dados de login nas classes de exemplo (endereço, nome de usuário e senha) e execute-os!
lendo arquivos conhecidos_hosts para verificação da chave do host
chave pública, senha e autenticação interativa com teclado
canais de comando, subsistema e shell
encaminhamento de porta local e remoto
scp + implementação completa do sftp versão 0-3
Estão incluídas implementações/adaptadores para os seguintes 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 também suporta as seguintes cifras estendidas (não oficiais): 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 também suporta os seguintes algoritmos estendidos (não oficiais) de troca de chaves: `[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
e [email protected]
(zlib atrasado)
pkcs5
, pkcs8
, openssh-key-v1
, [email protected]
, [email protected]
Se você precisar de algo que não está incluído, não deve ser muito difícil adicionar (contribua!)
Comparação de implementação SSH
Java 8 ou superior
SLF4J 2.0.0
Castelo Insuflável
Rastreador de problemas: https://github.com/hierynomus/sshj/issues
Garfo fora!
Mitigado CVE-2023-48795 - Terrapin
Mesclado #917: Implementar extensão estrita de troca de chaves OpenSSH
Mesclado #903: Correção para escrever string de chave de hosts conhecidos
Mesclado #913: Impedir que os buffers de encaminhamento de porta remota cresçam sem limites
Testes movidos para JUnit5
Mesclado #827: Fallback para a extensão [email protected], se disponível
Mesclado #904: Adicionar suporte ChaCha20-Poly1305 para chaves OpenSSH
Mesclado #899: Adicionar suporte para chaves privadas AES-GCM OpenSSH
Mesclado #901: Corrigir bug de compactação ZLib
Mesclado #898: Melhor manipulação de arquivos malformados para chaves privadas OpenSSH
Reescrever testes de integração para JUnit5
Mesclado #851: Corrigida condição de corrida na troca de chaves causando SSH_MSG_UNIMPLEMENTED intermitente
Mesclado #861: Adicionar DefaultSecurityProviderConfig com BouncyCastle desabilitado
Mesclado #881: Classes de teste reescritas para o mecanismo JUnit Jupiter
Mesclado #880: Utilitários de soquete backport Java 7 removidos
Mesclado #879: Base64 personalizado substituído por java.util.Base64
Mesclado #852: Métodos de hash de senha bcrypt não utilizados removidos
Mesclado #874: versão mínima do Java 8 + atualizações de dependências
Mesclado #876: Altere newStatefulSFTPClient
para retornar StatefulSFTPClient
Mesclado #860: Atualização para Gradle 7.6.1
Mesclado #838: Classe Curve25519 substituída pelo contrato de chave X25519
Mesclado #772: Remover dependência de jzlib
Mesclado #835: mensagem TimeoutException melhorada
Mesclado #815: Suporte authPassword no FreeBSD
Mesclado #813: Impedir CHANNEL_CLOSE
entre isOpen e chamada de gravação.
Mesclado #811: Adicione Transport.isKeyExchangeREquired
para evitar KEXINIT desnecessário
Mesclado #743: Use credenciais de cliente padrão para AuthGssApiWithMic
Mesclado #801: Restaurar o status de interrupção do thread após capturar InterruptedException
Mesclado #793: Mesclar classes PKCS5 e PKCS8
Dependências atualizadas SLF4J (1.7.36) e Logback (1.2.11)
Mesclado #791: Atualizar exemplos de KeepAlive
Mesclado #775: Adicionar suporte para currículo SFTP
Dependências atualizadas BouncyCastle (1.70)
Mesclado #687: Fechar corretamente a conexão quando o controle remoto fechar a conexão.
Mesclado #741: Adicionar suporte para testcontainers na configuração de teste para testar mais cenários
Mesclado #733: Enviar proposta de chave correta se o cliente souber a chave CA
Mesclado #746: Corrigido bug na leitura do arquivo de chave privada do Putty com senha
Mesclado #742: Use Config.keyAlgorithms para determinar o suporte a rsa-sha2
Mesclado #754: Use a versão do protocolo SFTP para definir sinalizadores de renomeação FXP condicionalmente
Mesclado #752: Iniciar e encerrar corretamente o thread KeepAlive
Mesclado #753: Forneça nomes de thread melhores
Mesclado #724: Adicionar parâmetro para limitar o comprimento da leitura antecipada
Mesclado #763: Experimente todos os algoritmos de chave pública para um tipo de chave específico
Mesclado #756: Remover métodos de conexão de proxy obsoletos
Mesclado #770: Adicionar suporte para chaves ed25519
aes-128-cbc
Mesclado #773: Correção do NPE ao ler OpenSSHKeyV1KeyFile vazio
Mesclado #777: Não solicite muitos pacotes de leitura antecipada
Enviar EOF no fechamento do canal (Correções #143, #496, #553, #554)
Mesclado #726: Analise chaves OpenSSH v1 com informações CRT completas presentes
Mesclado #721: Prefira algoritmo de chave de host conhecido para verificação de chave de host
Mesclados #716, #729 e #730: Adicione suporte completo para arquivos de chave PuTTY v3.
Mesclados #708 e #71: Adicionar suporte para chaves privadas PKCS#8
Mesclado #703: Suporta chaves de certificado de host
Dependências atualizadas BouncyCastle (1.69), SLF4j (1.7.32), Logback (1.2.6), asn-one (0.6.0)
Mesclado #702: Suporte à autenticação de chave pública usando certificados
Mesclado #691: Correção para escrever números inteiros negativos sem sinal no Buffer
Mesclado #682: Suporte para cifra [email protected]
Mesclado #680: Preservação configurável de mtimes para transferências SCP
Dependências de colisão (asn-one 0.5.0, BouncyCastle 1.68, slf4j-api 1.7.30)
Mesclado #660: Suporta chaves ED25519 e ECDSA no formato PuTTY
Fundido #655: Bump BouncyCastle devido a CVE
Mesclado #653: Tornar a classe Parameters utilizável como chave HashMap
Mesclado #647: Reduza o nível de log para analisador de identificação
Mesclado #630: Adicionar suporte para cifras [email protected]
e [email protected]
Mesclado #636: Melhor compatibilidade com Android
Mesclado #627: Evitar vazamento de chave
BREAKING CHANGE : setSignatureFactories
e getSignatureFactories
removidos do Config e trocados por getKeyAlgorithms
e setKeyAlgorithms
Corrigido #588: Adicionar suporte para assinaturas ssh-rsa2-256
e ssh-rsa2-512
Mesclado #579: Corrigir NPE em OpenSSHKnownHosts
Mesclado #587: Adicionar nova tentativa de busca de senha para OpenSSHKeyV1KeyFile
Mesclado #586: Torne o KeyType compatível com a Android Store
Mesclado #593: Altere UserAuth.getAllowedMethods()
para o tipo de retorno Collection
Mesclado #595: Permitir a leitura de chaves de comprimento arbitrário
Mesclado #591: Permitir consultar extensões SFTP
Mesclado #603: Adicionar método para criar cliente SFTP com estado
Mesclado #605: Use threads Daemon para evitar bloquear o desligamento da JVM
Mesclado #606: Sempre use o JCERandom RNG por padrão
Mesclado #609: Limpe a senha após o uso para evitar problemas de segurança
Mesclado #618: Correção da porta local do DirectConnection para uso com OpenSSH > 8.0
Mesclado #619: BouncyCastle atualizado para 1.66
Mesclado #622: Envie 'ext-info-c' com algoritmos KEX
Mesclado #623: Corrigida codificação de transporte de assinaturas nistp521
Mesclado #607: Corrigir chaves públicas matemáticas para algoritmos principais
Mesclado #602: Corrigir a determinação da chave do certificado RSA
Corrigido # 415: corrigido o prefixo errado '/' para o caminho em SFTPClient.mkdirs
Adicionado suporte para algoritmos MAC ETM (Encrypt-then-Mac).
Corrigido #454: Adicionada verificação de capacidade ausente para Buffer.putUint64
Corrigido #466: Adicionado tempo limite de bloqueio para ação remota para evitar travamentos
Corrigido # 470: EdDSA tornou-se a fábrica de assinatura padrão (primeira)
Corrigido #467: Adicionado AES256-CBC como modo de cifra no suporte openssh-key-v1
Corrigido #464: [email protected] ativado em DefaultConfig
Corrigido #472: Lidar com solicitações globais iniciadas pelo servidor
Corrigido nº 485: Adicionado suporte para todos os tipos de chave aos arquivos-chave openssh-key-v1.
Corrigido nº 413: use UTF-8 para PrivateKeyFileResource
Corrigido nº 427: suporte a arquivos ed25519 openssh-key-v1 criptografados
BouncyCastle atualizado para 1.60
Adicionado suporte para [email protected] MAC
Adicionado suporte para hmac-ripemd160
Corrigido # 382: Corrigido o escape em WildcardHostmatcher
Adicionado conjunto de testes de integração usando Docker contra OpenSSH
Corrigido # 187: bug de comprimento corrigido em Buffer.putString
Corrigido #405: Continue a verificação do host se a primeira chave do host não corresponder.
Mesclado #372: Atualização para 'net.i2p.crypto:eddsa:0.2.0'
Corrigidos #355 e #354: decodificação correta de bytes de assinatura
Correção nº 365: Adicionado suporte para impressões digitais OpenSSH de chaves de servidor de novo estilo
Correção #356: Corrigida detecção de tipo de chave para chaves públicas ECDSA
Tornou SSHJ compatível com Java9
Corrigido #341: Correção do caminho durante a cópia recursiva
Mesclado #338: Adicionado ConsolePasswordFinder para ler a senha do stdin
Mesclado #336: Adicionado suporte para assinaturas ecdsa-sha2-nistp384 e ecdsa-sha2-nistp521
Corrigido #331: Adicionado suporte para curingas no arquivoknown_hosts
Mesclado #322: Correção da regressão de 40f956b (parâmetro de comprimento inválido no fluxo de saída)
Mesclado #319: Adicionado suporte para arquivos de chave de certificado [email protected]
e [email protected]
Gradle atualizado para 3.4.1
Mesclado #305: Adicionado suporte para codificação de string personalizada
Corrigido #312: BouncyCastle atualizado para 1.56
Mesclado #294: Referência ED25519 por constante em vez de nome
Mesclados #293, #295 e #301: Pacote OSGi corrigido
Adicionados novos grupos Diffie Hellman 15-18 para algoritmos KeyExchange mais fortes
Arquivos de chave PKCS5 ativados em DefaultConfig
Mesclado #291: Corrigido o carregamento de sshj.properties e mensagens de exceção encadeadas
Mesclado #284: Captura corretamente a interrupção no thread de manutenção de atividade
Corrigido #292: Passe o RandomFactory configurado para Diffie Hellman KEX
Corrigido nº 256: SSHJ agora é compilado se nenhum repositório git estiver presente
LocalPortForwarder agora interrompe corretamente seu próprio thread em close()
Correção nº 276: Adicionar suporte para ed-25519 e novo formato de chave OpenSSH
Correção nº 280: Ler a versão de um arquivo sshj.properties gerado para gerar a versão corretamente durante a negociação
Compatibilidade corrigida do Android
Atualize para o Gradle 3.0
Mesclado nº 271: Carregue conhecidos_hosts sem exigir BouncyCastle
Mesclado #269: Suporte Java6 trazido de volta por demanda popular
Mesclado #267: Adicionado suporte para registro por conexão (Correções #264)
Mesclados #262, #265 e #266: Adicionado suporte ao arquivo de chave PKCS5
Corrigido toString de sftp FileAttributes (Correções #258)
Corrigido # 255: não depende mais de classes 'marcadas de forma privada' no pacote net.i2p.crypto.eddsa.math
, corrige dependências OSGI
Tratar a linha de identificação do servidor SSH que termina em 'n' em vez de 'rn' com tolerância.
Análise aprimorada da identificação do servidor SSH. Linhas de cabeçalho muito longas agora não quebram mais o protocolo.
Introduzida alteração significativa no comportamento da cópia SFTP : Anteriormente, uma operação de cópia SFTP se comportaria de maneira diferente se a origem e o destino fossem pastas com nomes diferentes. Neste caso, em vez de copiar o conteúdo da fonte para o diretório de destino, o próprio diretório foi copiado como um subdiretório do diretório de destino. Este comportamento foi removido em favor do comportamento padrão que é copiar o conteúdo da origem para o destino. Alinhando o comportamento com o funcionamento do SCP.
Corrigido #252 (via: #253): subdiretórios com o mesmo nome não são mais mesclados por acidente
Corrigido nº 239: os encaminhamentos de porta remotos não funcionavam se você usasse a string vazia como endereço ou um endereço pega-tudo.
Correção nº 242: cabeçalhos OSGI adicionados ao manifesto do jar de fontes
Correção nº 236: o encaminhamento remoto de porta com alocação dinâmica de porta falha com BufferUnderflowException
Distribuição gradle atualizada para 2.12
Fechado #234: Suporte Java6 descartado (0.15.0 já era incompatível com Java6 devido à dependência de Java7)
Correção nº 118: Adicionada opção de configuração para aguardar uma identificação do servidor antes de enviar a identificação do cliente.
Correção nº 114: Adicionado javadoc que você sempre precisa chamar close() em um comando antes de inspecionar os códigos de saída.
Corrigido #237: Corrigida a condição de corrida se uma solicitação global [email protected]
fosse recebida diretamente após uma autenticação bem-sucedida.
Correção nº 220: Adicionado suporte para chaves de host ssh-ed25519
Corrigido #225: Corrigido bug no cálculo da impressão digital ECDSA que às vezes produzia uma impressão digital incorreta
Adicionadas cifras de fluxo arcfour
de RFC4253 e RFC4345
Adicionadas todas as cifras de bloco de RFC4344 e RFC4253
Correção nº 171: Adicionado suporte para algoritmo de troca de chaves [email protected]
Adicionado suporte para algoritmos de troca de chaves ecdh-sha2-nistp256
, ecdh-sha2-nistp384
e ecdh-sha2-nistp521
Correção nº 167: Adicionado suporte para métodos de troca de chaves diffie-hellman-group-exchange-sha1
e diffie-hellman-group-exchange-sha256
Correção nº 212: configure o escape do caminho para permitir que a expansão do shell funcione corretamente
Mesclado #210: RemoteFileInputStream.skip retorna valor errado (Correções #209)
Mesclado #208: Adicionado suporte à limitação de largura de banda SCP
Mesclado #211: Tornou a detecção de formato de arquivo-chave mais robusta
Mesclado #199: Correção para IndexOutOfBoundsException em ReadAheadRemoteFileInputStream, correções #183
Mesclado #195: Nova autenticação suportada: gssapi-with-mic
Mesclado #201: Nova opção para verificar algoritmos de troca de chaves negociadas
Mesclado #196: Correção para procurar nome de host completo em arquivo de hosts conhecidos
Adicionado suporte para proxies HTTP ao executar JDK6 ou JDK7, correções: #170
Mesclado #186: Correção para detecção de fim de fluxo
Compilando para JDK6, corrige #179 e #185
Fechar corretamente o soquete e o canal quando LocalPortForwarder não consegue abrir e iniciar o canal (Correções #175 e #176)
Mesclado #181: Comprimento de pacote de gravação inválido ao ler com deslocamento (Correções #180)
Novas coordenadas do maven com.hierynomus:sshj:0.11.0
quando @hierynomus assumiu como mantenedor do SSHJ
Sistema de compilação migrado para Gradle 2.2.1
Mesclado #150: Correção para manipulação incorreta de arquivos em alguns servidores SSH, correções: #54, #119, #168, #169
Tornou jzlib
opcional no pacote OSGi, correções: #162
Melhorados alguns níveis de log, correções: #161
Mesclado #156, #164, #165: Tamanhos de bloco fixos para hmac-sha2-256
e hmac-sha2-512
Mesclado #141: Adicionar suporte a proxy
Mesclado #157, #163: Correções de documentação e compilação
BouncyCastle atualizado para 1.51, correções: #142
Implementado keep-alive com detecção de queda de conexão, correções #166