경고 | 0.37.0 이하의 SSHJ 버전은 CVE-2023-48795 - Terrapin에 취약합니다. 0.38.0 이상으로 업그레이드해주세요. |
시작하려면 예제 중 하나를 살펴보세요. API를 사용하여 즐겁게 작업할 수 있기를 바랍니다. :)
SSHJ를 얻으려면 두 가지 옵션이 있습니다.
프로젝트에 SSHJ에 대한 종속성을 추가합니다.
SSHJ를 직접 구축해 보세요.
또한 원하는 경우 SSHJ 예제를 실행할 수도 있습니다.
SSHJ의 바이너리 릴리스는 여기에 제공되지 않지만 원하는 경우 Maven Central 저장소에서 직접 다운로드할 수 있습니다.
Maven을 사용하여 프로젝트를 빌드하는 경우 pom.xml
에 다음 종속성을 추가할 수 있습니다.
< dependency >
< groupId >com.hierynomus</ groupId >
< artifactId >sshj</ artifactId >
< version >0.38.0</ version >
</ dependency >
Maven Central 저장소를 사용하는 다른 빌드 도구를 사용하여 프로젝트를 빌드한 경우 이 종속성을 빌드 도구에서 사용하는 형식으로 변환하세요.
SSHJ 저장소를 복제합니다.
무제한 강도의 JCE(Java Cryptography Extensions)가 포함된 Java6이 설치되어 있는지 확인하십시오.
./gradlew clean build
명령을 실행합니다.
examples
디렉토리에는 일부 샘플 사례에서 라이브러리를 사용하는 방법을 보여주는 별도의 Maven 프로젝트가 있습니다. 실행하려면 다음 지침을 따르세요.
Maven 2.2.1 이상을 설치하세요.
SSHJ 저장소를 복제합니다.
examples
디렉토리로 이동하여 mvn eclipse:eclipse
명령을 실행하십시오.
examples
프로젝트를 Eclipse로 가져옵니다.
예제 클래스(주소, 사용자 이름, 비밀번호)에서 로그인 세부 정보를 변경하고 실행하세요!
호스트 키 확인을 위해 Known_hosts 파일 읽기
공개키, 비밀번호 및 키보드 대화형 인증
명령, 하위 시스템 및 셸 채널
로컬 및 원격 포트 포워딩
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-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 구현 비교
자바 8 이상
SLF4J 2.0.0
바운시 캐슬
이슈 추적기: https://github.com/hierynomus/sshj/issues
포크로 쳐내세요!
완화된 CVE-2023-48795 - Terrapin
병합 #917: OpenSSH 엄격한 키 교환 확장 구현
병합 #903: 알려진 호스트 키 문자열 쓰기 문제 수정
병합 #913: 원격 포트 전달 버퍼가 제한 없이 커지는 것을 방지합니다.
테스트를 JUnit5로 이동했습니다.
병합된 #827: 가능한 경우 [email protected] 확장명으로 대체
병합 #904: OpenSSH 키에 대한 ChaCha20-Poly1305 지원 추가
병합 #899: AES-GCM OpenSSH 개인 키에 대한 지원 추가
병합 #901: ZLib 압축 버그 수정
병합 #898: OpenSSH 개인 키에 대한 잘못된 형식의 파일 처리 개선
JUnit5에 통합 테스트를 다시 작성했습니다.
병합 #851: 간헐적으로 SSH_MSG_UNIMPLEMENTED를 발생시키는 키 교환의 경쟁 조건 수정
병합된 #861: BouncyCastle이 비활성화된 DefaultSecurityProviderConfig 추가
병합 #881: 테스트 클래스를 JUnit Jupiter 엔진으로 다시 작성했습니다.
병합 #880: Java 7 백포트 소켓 유틸리티가 제거되었습니다.
병합 #879: 사용자 정의 Base64를 java.util.Base64로 대체했습니다.
병합 #852: 사용되지 않는 bcrypt 비밀번호 해싱 방법을 제거했습니다.
병합 #874: Java 8 최소 버전 + 종속성 업그레이드
병합된 #876: StatefulSFTPClient
반환하도록 newStatefulSFTPClient
변경합니다.
병합된 #860: Gradle 7.6.1로 업그레이드
병합된 #838: Curve25519 클래스를 X25519 키 계약으로 대체했습니다.
병합 #772: jzlib에 대한 종속성 제거
병합 #835: TimeoutException 메시지 개선
병합된 #815: FreeBSD에서 authPassword 지원
병합된 #813: isOpen과 쓰기 호출 사이에 CHANNEL_CLOSE
방지합니다.
병합 #811: 불필요한 KEXINIT를 방지하기 위해 Transport.isKeyExchangeREquired
를 추가합니다.
병합 #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 스레드를 올바르게 시작하고 종료합니다.
Merged #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로 인해 Bump 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 스토어와 호환되게 만들기
병합 #593: UserAuth.getAllowedMethods()
컬렉션 반환 유형으로 변경
병합 #595: 임의 길이의 키 읽기 허용
병합 #591: SFTP 확장 프로그램 쿼리 허용
병합 #603: Stateful SFTP 클라이언트를 생성하는 메서드 추가
병합 #605: 데몬 스레드를 사용하여 JVM 종료 차단 방지
병합 #606: 기본적으로 항상 JCERandom RNG를 사용합니다.
병합 #609: 보안 문제를 방지하기 위해 사용 후 암호 문구 지우기
병합 #618: OpenSSH > 8.0에서 사용할 수 있도록 DirectConnection의 로컬 포트 수정
병합 #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에서 이스케이프 문제를 수정했습니다.
OpenSSH에 대해 Docker를 사용하여 통합 테스트 모음을 추가했습니다.
#187 수정: Buffer.putString의 길이 버그 수정
고정된 #405: 첫 번째 호스트 키가 일치하지 않으면 호스트 확인을 계속합니다.
병합된 #372: 'net.i2p.crypto:eddsa:0.2.0'으로 업그레이드
수정된 #355 및 #354: 서명 바이트를 올바르게 디코딩합니다.
수정된 #365: 서버 키의 새로운 스타일 OpenSSH 지문에 대한 지원이 추가되었습니다.
고정 #356: ECDSA 공개 키에 대한 고정 키 유형 감지
SSHJ Java9 호환 가능
고정 #341: 재귀 복사 중 고정 경로 걷기
병합 #338: stdin에서 비밀번호를 읽기 위해 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 패키징 수정
더 강력한 KeyExchange 알고리즘을 위해 새로운 Diffie Hellman 그룹 15-18을 추가했습니다.
DefaultConfig에서 PKCS5 키 파일을 활성화했습니다.
병합 #291: sshj.properties 로드 및 연결된 예외 메시지 수정
병합 #284: Keepalive 스레드에서 인터럽트를 올바르게 포착합니다.
수정된 #292: 구성된 RandomFactory를 Diffie Hellman KEX에 전달합니다.
수정된 #256: 이제 git 저장소가 없으면 SSHJ가 빌드됩니다.
LocalPortForwarder는 이제 close() 시 자체 스레드를 올바르게 중단합니다.
수정된 #276: ed-25519 및 새로운 OpenSSH 키 형식에 대한 지원 추가
수정된 #280: 협상 중에 버전을 올바르게 출력하기 위해 생성된 sshj.properties 파일에서 버전을 읽습니다.
안드로이드 호환성 수정
Gradle 3.0으로 업그레이드
병합 #271: BouncyCastle 없이 Known_hosts 로드
병합 #269: 대중의 요구에 따라 Java6 지원을 다시 가져왔습니다.
병합 #267: 연결별 로깅에 대한 지원 추가(수정 #264)
#262, #265 및 #266 병합: PKCS5 키 파일 지원 추가
sftp FileAttributes의 문자열로 수정됨(수정 #258)
수정된 #255: net.i2p.crypto.eddsa.math
패키지의 '개인적으로 표시된' 클래스에 더 이상 의존하지 않고 OSGI 종속성을 수정합니다.
'rn' 대신 'n'으로 끝나는 SSH 서버 식별 줄을 관대하게 처리합니다.
SSH 서버 식별 구문 분석이 개선되었습니다. 너무 긴 헤더 줄은 이제 더 이상 프로토콜을 중단하지 않습니다.
SFTP 복사 동작에 주요 변경 사항 도입 : 이전에는 원본과 대상이 모두 다른 이름을 가진 폴더인 경우 SFTP 복사 작업이 다르게 동작했습니다. 이 경우 소스의 내용을 대상 디렉터리에 복사하는 대신 디렉터리 자체가 대상 디렉터리의 하위 디렉터리로 복사되었습니다. 소스의 내용을 대상에 복사하는 기본 동작을 위해 이 동작이 제거되었습니다. SCP 작동 방식에 맞춰 동작을 가져옵니다.
고정 #252(경유: #253): 동일한 이름의 하위 디렉터리가 더 이상 실수로 병합되지 않습니다.
고정된 #239: 빈 문자열을 주소 또는 포괄 주소로 사용한 경우 원격 포트 전달이 작동하지 않았습니다.
수정된 #242: 소스 jar 매니페스트에 OSGI 헤더를 추가했습니다.
수정된 #236: 동적 포트 할당을 사용한 원격 포트 전달이 BufferUnderflowException으로 인해 실패합니다.
Gradle 배포판을 2.12로 업그레이드했습니다.
종료 #234: Java6 지원 중단(0.15.0은 이미 Java7 종속성으로 인해 Java6과 호환되지 않음)
고정된 #118: 클라이언트 ID를 보내기 전에 서버 ID를 기다리는 구성 스위치를 추가했습니다.
수정된 #114: 종료 코드를 검사하기 전에 명령에서 항상 close()를 호출해야 하는 javadoc를 추가했습니다.
고정된 #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: 셸 확장이 올바르게 작동할 수 있도록 경로 이스케이프를 구성합니다.
병합 #210: RemoteFileInputStream.skip이 잘못된 값을 반환함(수정 #209)
병합 #208: SCP 대역폭 제한 지원 추가
Merged #211: 키 파일 형식 감지를 더욱 강력하게 만들었습니다.
병합 #199: ReadAheadRemoteFileInputStream의 IndexOutOfBoundsException 수정, 수정 #183
병합 #195: 새로운 인증 지원: gssapi-with-mic
병합 #201: 협상된 키 교환 알고리즘을 확인하는 새로운 옵션
병합 #196: 알려진 호스트 파일에서 전체 호스트 이름을 찾는 문제 수정
JDK6 또는 JDK7을 실행할 때 HTTP 프록시에 대한 지원이 추가되었습니다. 수정 사항: #170
병합 #186: 스트림 끝 감지 문제 수정
JDK6으로 컴파일, 수정 #179 및 #185
LocalPortForwarder가 채널을 열고 시작하지 못하는 경우 소켓과 채널을 올바르게 닫습니다(수정 #175 및 #176).
병합 #181: 오프셋으로 읽을 때 쓰기 패킷 길이가 잘못되었습니다(수정 #180).
@hierynomus가 SSHJ의 관리자로 인수됨에 따라 새로운 maven 좌표 com.hierynomus:sshj:0.11.0
Gradle 2.2.1로 빌드 시스템 마이그레이션
병합 #150: 일부 SSH 서버의 잘못된 파일 핸들 수정, 수정: #54, #119, #168, #169
OSGi 번들링에서 jzlib
선택적으로 만들었습니다. 수정 사항: #162
일부 로그 수준 개선, 수정 사항: #161
병합된 #156, #164, #165: hmac-sha2-256
및 hmac-sha2-512
에 대한 고정 블록 크기
병합 #141: 프록시 지원 추가
병합 #157, #163: 문서 및 빌드 수정 사항
BouncyCastle을 1.51로 업그레이드하고 수정 사항: #142
연결 끊김 감지를 통한 연결 유지 구현, 수정 사항 #166