본문 바로가기
IT/Web

[Java] Jsch로 SSH 연결 시 Algorithm DH not available 오류 해결

by 한동두 2024. 6. 12.
반응형

1. 문제상황

로컬 컴퓨터에서는 아무 문제 없이 연결되던 SSH연결이

개발환경에서 갑자기 안되는 문제가 발생했다. 

 

java.security.NoSuchAlgorithmException: Algorithm DH not available

DH알고리즘이 없다는 뜻이므로, 적절한 DH알고리즘을 가지고있는 라이브러리를 이용하면될것으로 보인다.

 

 

 


2. 문제 해결

BouncyCastle 라이브러리 다운로드 링크

bouncycastle을 사용해주면 해결 할 수 있다. 위 링크에서 필요한 버전을 찾아주자.

 

그리고 Pom.xml (gradle의 경우 build.gradle)에 dependency에 추가해주자.

난 jdk-1.8이라서 1.78.1를 사용하면 된다.

<dependency>
	<groupId>org.bouncycastle</groupId>
	<artifactId>bcprov-jdk18on</artifactId>
	<version>1.78.1</version>
</dependency>

 

그러고 코드에 

Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
java.security.KeyPairGenerator.getInstance("DH");
javax.crypto.KeyAgreement.getInstance("DH");

Jsch를 사용하기 전에 앞쪽에 넣어주면된다.

 

더보기

예시

private void connectSSH() throws JSchException {

            //Bouncycastle 코드 추가

            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
             java.security.KeyPairGenerator.getInstance("DH");
             javax.crypto.KeyAgreement.getInstance("DH");

 

            //기존 connectSSH코드
            session = new JSch().getSession(userId, hostIp, hostPort);
            session.setPassword(userPw);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect();
        }

 

 

 


3. 버전 문제 해결

나는 저렇게 해도 해결이 안돼서 한참 헤메다가 (config도 이래저래 뒤져봤는데 아무것도 안됨)

jsch의 버전이 구버전으로 되어있는걸 발견했다.

 

<dependency>
            <groupId>com.jcraft</groupId>
            <artifactId>jsch</artifactId>
            <version>0.2.18</version>
        </dependency>

0.1.55 -> 0.2.18로 변경하니 해결되었다.

아마 jdk-1.8이랑 호환이 잘 안되는 버전인거같다.

 

혹시 위에 provider에 Bouncycastle 추가했는데도 안되면

Jsch버전을 바꿔서 다시 시도해보길 바란다!!

반응형