Loading

SFTP 커넥터가 SFTP 서버에 연결을 시도하면 "알고리즘 협상 실패" 오류 발생

게시 일자: Oct 16, 2024
솔루션

증상

다음과 유사한 스택 추적이 표시되는 예외와 함께 SFTP 커넥터가 포함된 Mule 응용 프로그램이 실패합니다.

org.mule.runtime.api.connection.ConnectionException: 호스트와 SFTP 연결을 설정할 수 없음: 포트에서 'yourHost': 'yourPort' - 알고리즘 협상 실패원인: com.jcraft.jsch.JSchException: 알고리즘 협상 실패com.jcraft.jsch.Session.receive_kexinit(Session.java:590)com.jcraft.jsch.Session.connect(Session.java:320)com.jcraft.jsch.Session.connect(Session.java:183)org.mule.extension.sftp.internal.connection.SftpClient.connect(SftpClient.java:179)org.mule.extension.sftp.internal.connection.SftpClient.login(SftpClient.java:161)org.mule.extension.sftp.internal.connection.SftpConnectionProvider.connect(SftpConnectionProvider.java:139)org.mule.extension.sftp.internal.connection.SftpConnectionProvider.connect(SftpConnectionProvider.java:59)

원인

SFTP를 통해 클라이언트와 서버 간에 보안 연결을 시도하면 두 가지 머리글에 키 교환 알고리즘, 암호화된 알고리즘, 메시지 인증 코드(MAC), 압축 알고리즘의 목록이 나타납니다. 각 해당 알고리즘은 가장 안전한 항목에서 가장 안전하지 않은 항목의 순서대로 정렬됩니다. 알고리즘을 사용하여 SSH 연결을 진행하는 최상의 옵션을 협상합니다. 이 협상 동안 사용할 알고리즘 구현에 대한 협약이 없으면 "알고리즘 협상 실패" 메시지가 수신됩니다. 
SSH RFC4253 섹션 7.1에서 이 SSH 알고리즘 협상에 대한 자세한 내용을 확인할 수 있습니다.

SFTP 디버그 로그를 활성화하여 Mule 응용 프로그램에서 협상 정보를 확인할 수 있습니다.

패키지를 설정하여 DEBUG 로그를 활성화하는 Mule 4.x의 경우 "FTP 및 SFTP 및 FTPS 모듈에 장황한 로깅을 활성화하는 방법"으로 충분하며, Mule 3.x에서는 JSCH에서 DEBUG 로그를 검색하기 위해 추가 수정 사항이 필요하며, 이 경우 MuleSoft 지원 팀에 문의해야 합니다.

이 협상을 보여주는 SFTP DEBUG 로그의 예는 아래에서 확인할 수 있습니다.

DEBUG 2021-03-17 19:57:23,944 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] org.mule.extension.sftp.internal.connection.SftpConnectionProvider: 호스트에 연결: 포트에서 'myHost': 'myPort'DEBUG 2021-03-17 19:57:23,945 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: myHost 포트 myPort에 연결DEBUG 2021-03-17 19:57:23,971 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: 연결 설정됨DEBUG 2021-03-17 19:57:24,002 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: 원격 버전 문자열: SSH-2.0-CerberusFTPServer_11.0DEBUG 2021-03-17 19:57:24,002 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: 로컬 버전 문자열: SSH-2.0-JSCH-0.1.54DEBUG 2021-03-17 19:57:24,002 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256DEBUG 2021-03-17 19:57:24,006 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: aes256-ctr은 사용할 수 없습니다.DEBUG 2021-03-17 19:57:24,006 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: aes192-ctr은 사용할 수 없습니다.DEBUG 2021-03-17 19:57:24,006 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: aes256-cbc는 사용할 수 없습니다.DEBUG 2021-03-17 19:57:24,006 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: aes192-cbc는 사용할 수 없습니다.DEBUG 2021-03-17 19:57:24,006 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521DEBUG 2021-03-17 19:57:24,075 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521DEBUG 2021-03-17 19:57:24,075 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: SSH_MSG_KEXINIT 전송됨DEBUG 2021-03-17 19:57:24,075 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: SSH_MSG_KEXINIT 수신됨DEBUG 2021-03-17 19:57:24,075 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: ssh-rsa,ssh-ed25519,rsa-sha2-512,rsa-sha2-256DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: aes256-ctr,aes256-cbcDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: aes256-ctr,aes256-cbcDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: hmac-sha1,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-md5DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: hmac-sha1,hmac-sha2-256,hmac-sha2-512,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-md5DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: noneDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: noneDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: en-USDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: server: en-USDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbcDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbcDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: noneDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: noneDEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: DEBUG 2021-03-17 19:57:24,076 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: kex: client: DEBUG 2021-03-17 19:57:24,077 [[MuleRuntime].uber.08: [my-mule-application].my-mule-applicationFlow.CPU_LITE @2a316d37] [processor: my-mule-applicationFlow/processors/0; event: ] com.jcraft.jsch: myHost 포트 myPort에서 연결 해제

이 기사에서는 다음 두 가지 시나리오에 대해 다룹니다.

시나리오 1: 압축 알고리즘이 일치하지 않습니다.

압축 알고리즘이 일치하지 않으면 아래의 코드 조각과 유사하게 표시됩니다.

com.jcraft.jsch: kex: server: zlibcom.jcraft.jsch: kex: client: none
시나리오 2: 사용된 암호가 일치하지 않습니다.

암호 불일치는 아래의 코드 조각과 유사하게 표시됩니다.

com.jcraft.jsch: kex: server: aes256-ctr,aes256-cbccom.jcraft.jsch: kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc

솔루션 

DEBUG 로그의 시작 부분에 서버 및 클라이언트(SFTP 커넥터) 모두에서 지원되는 SSH 버전이 나열됩니다.

원격 버전 문자열: SSH-2.0-OpenSSH_8.8로컬 버전 문자열: SSH-2.0-JSCH-0.1.54

일반적으로 RFC에 언급된 협상된 각 알고리즘 범주에 클라이언트와 서버 간에 하나 이상의 구현이 있어야만(및 제약 충족) 처리됩니다.

RFC 4253: 알고리즘 협상      name-list    kex_algorithms      name-list    server_host_key_algorithms      name-list    encryption_algorithms_client_to_server      name-list    encryption_algorithms_server_to_client      name-list    mac_algorithms_client_to_server      name-list    mac_algorithms_server_to_client      name-list    compression_algorithms_client_to_server      name-list    compression_algorithms_server_to_client      name-list    languages_client_to_server      name-list    languages_server_to_client
예를 들어 각 행은 서버와 클라이언트가 제공하는 알고리즘의 목록을 보여줍니다. server의 단일 알고리즘에 client가 제공하는 일치 알고리즘이 포함되어 있지 않을 경우에도 협상에 실패합니다. 아래 예에서는 "server_host_key_algorithms"에 제공된 알고리즘이 클라이언트가 제공한 알고리즘과 일치하지 않으며 협상에 실패합니다.
  SFTP 알고리즘 실패

시나리오 1(압축 알고리즘)

SFTP 커넥터는 현재 "zlib" 압축을 지원하지 않으며, 따라서 서버측에서 동의할 수 있는 유일한 알고리즘은 "NONE"입니다. 아이디어 포털을 통해 향상 요청이 생성됨  

현재 사용 가능한 대안은 다음과 같습니다.

  1. 압축 없이 연결을 허용하도록 SFTP 서버를 구성합니다("NONE" 알고리즘이 활성화되어 제공). 
  2. Java 12D/DeviKit(Mule 3.x) 또는 Java 모듈을 사용하는 Java 프로그램을 통해 사용자 정의 커넥터를 개발하여 이 기능을 허용하는 라이브러리로 해당 SFTP 서버에 연결합니다.

시나리오 2(암호 불일치)

a. 사용된 JSCH 라이브러리가 사용하려는 암호를 지원하는지 확인합니다.

SFTP 커넥터는 JSCH 라이브러리를 사용하여 SFTP 서버에 연결을 설정하며, JSCH에는 사용된 버전에 따라 문서에 설명된 지원되는 암호가 집합되어 있으며, JSCH ChangeLog에서 포함된 기능을 볼 수 있습니다. 

  • Mule Runtime 4.x의 경우, 라이브러리는 각 SFTP 커넥터 릴리스와 함께 제공되며, Anypoint Studio의 패키지 탐색기를 통해 쉽게 버전에 액세스할 수 있습니다.

예:


Anypoint Studio 패키지 탐색기

  • Mule Runtime 3.x에서 라이브러리는 런타임 자체와 함께 번들 처리되며 /lib/opt 디렉터리에서 "jsch-" 접두사로 시작하는 .jar 파일을 검색하여 확인할 수 있습니다.

라이브러리가 암호를 지원하지 않을 경우 SFTP 서버에서 해당 JSCH 버전이 지원하는 암호 사이에 포함된 암호를 하나 이상 활성화해야 합니다.

중요: 사용 중인 라이브러리를 수정하지 않는 것이 좋습니다. SFTP 커넥터 동작이 테스트되고 번들 처리된 버전으로 검증되므로, 이 작업을 시도할 경우 낮은 환경에서 수행하고 가능하면 MuleSoft 지원 팀에 JSCH 버전이 호환되는지 확인하십시오.

b. JVM 수준에서 암호가 사용 가능한지 여부를 확인합니다. 

SFTP 커넥터는 JSCH 라이브러리를 내부적으로 사용하여 SFTP 서버에 연결하며, 이 라이브러리는 최종적으로 JCE Java(TM) 암호화 확장을 사용합니다. 일부 JVM에서는 제어 제한 사항으로 인해 특정 암호가 포함되지 않을 수 있습니다. 공급업체 문서에 따라 사용 중인 JVM에 해당 제한이 적용되는지 확인해야 합니다.

예를 들어 Oracle JVM의 경우 특정 암호를 허용하기 위해 JCE 무제한 강도를 추가해야 하며, 각 Java 버전에는 자체 JCE 일치 패키지 및 설치 세부 사항이 마련되어 있습니다.

JDK8의 경우

무제한 강도 정책, 설치 세부 사항, 무제한 강도 JCE 정책 파일을 참조하십시오.

고지 사항: 이 솔루션은 특정 사용 사례 및 요구 사항과 함께 고려해야 하는 제안을 제공하며, 모든 상황에 대한 전체 솔루션을 나타내지는 않습니다.

Knowledge 기사 번호

001121369

 
로드 중
Salesforce Help | Article