1. 문제상황
로컬 컴퓨터에서는 아무 문제 없이 연결되던 SSH연결이
개발환경에서 갑자기 안되는 문제가 발생했다.
java.security.NoSuchAlgorithmException: Algorithm DH not available
DH알고리즘이 없다는 뜻이므로, 적절한 DH알고리즘을 가지고있는 라이브러리를 이용하면될것으로 보인다.
2. 문제 해결
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버전을 바꿔서 다시 시도해보길 바란다!!
'IT > Web' 카테고리의 다른 글
[Linux(Rocky) 서버 구축] 서버 구축 - 1. 운영체제 설치 (하이퍼링크) (0) | 2025.02.07 |
---|---|
[Linux(Rocky) 서버 구축] 서버 구축 전 과정 정리 (하이퍼링크) (0) | 2025.02.06 |
[Ajax] 반복문 안에 Ajax 실행 시 차례대로 수행하게 하는 법 (0) | 2024.04.25 |
[python] 웹사이트 크롤링 - FullScreen 캡쳐하기 (Selenium) (4) | 2024.01.10 |
[에러] Spring에 MySQL 연결하기 (Gradle) (2) | 2024.01.03 |