Loading

Errore "Algorithm negotiation fail" (Negoziazione algoritmo non riuscita) quando il connettore SFTP tenta di connettersi al server SFTP

Data pubblicazione: Oct 16, 2024
Risoluzione

SINTOMO

Un'applicazione Mule contenente un connettore SFTP ha esito negativo, con un'eccezione che mostra una traccia dello stack simile a quella riportata di seguito:

org.mule.runtime.api.connection.ConnectionException: Could not establish SFTP connection with host: 'yourHost' at port: 'yourPort' - Algorithm negotiation failCaused by: com.jcraft.jsch.JSchException: Algorithm negotiation failat com.jcraft.jsch.Session.receive_kexinit(Session.java:590)at com.jcraft.jsch.Session.connect(Session.java:320)at com.jcraft.jsch.Session.connect(Session.java:183)at org.mule.extension.sftp.internal.connection.SftpClient.connect(SftpClient.java:179)at org.mule.extension.sftp.internal.connection.SftpClient.login(SftpClient.java:161)at org.mule.extension.sftp.internal.connection.SftpConnectionProvider.connect(SftpConnectionProvider.java:139)at org.mule.extension.sftp.internal.connection.SftpConnectionProvider.connect(SftpConnectionProvider.java:59)

CAUSA

Quando viene tentata una connessione protetta tra un client e un server tramite SFTP, entrambi espongono un elenco di algoritmi di scambio delle chiavi, algoritmi di crittografia, codici MAC (Message Authentication Code) e algoritmi di compressione. Ciascun di questi algoritmi è ordinato dal più protetto al meno protetto. Gli algoritmi vengono utilizzati per negoziare l'opzione migliore per procedere con la connessione SSH. Se durante questa negoziazione non si trova un accordo sulle implementazioni dell'algoritmo da utilizzare, si riceverà il messaggio "Algorithm negotiation fail" (Negoziazione algoritmo non riuscita). 
Un dettaglio approfondito sulla negoziazione dell'algoritmo SSH è disponibile in SSH RFC4253, sezione 7.1

È possibile visualizzare le informazioni di negoziazione in un'applicazione Mule abilitando i registri di debug SFTP.

Nel caso di Mule 4.x, è sufficiente abilitare i registri DEBUG tramite l'impostazione dei pacchetti ("How to enable verbose logging for FTP and SFTP and FTPS modules") (Come abilitare la registrazione dettagliata per i moduli FTP, SFTP e FTPS)), in Mule 3.x sono necessarie alcune modifiche aggiuntive per recuperare da JSCH i registri DEBUG. A tale scopo occorre contattare l'assistenza MuleSoft.

Un esempio di registro DEBUG di SFTP con questa negoziazione è riportato di seguito:

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: Connecting to host: 'myHost' at port: '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: Connecting to myHost port myPortDEBUG 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: Connection establishedDEBUG 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: Remote version string: 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: Local version string: 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 is not available.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 is not available.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 is not available.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 is not available.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 sentDEBUG 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 receivedDEBUG 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: Disconnecting from myHost port myPort

In questo articolo verranno trattati due scenari:

Scenario 1: Mancata corrispondenza nell'algoritmo di compressione.

Una mancata corrispondenza dell'algoritmo di compressione ha un aspetto simile allo snippet riportato di seguito.

com.jcraft.jsch: kex: server: zlibcom.jcraft.jsch: kex: client: none
Scenario 2: Mancata corrispondenza dei tipi di crittografia utilizzati.

La mancata corrispondenza della crittografia ha un aspetto simile allo snippet riportato di seguito.

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

SOLUZIONE 

Le versioni SSH supportate sia dal server che dal client (connettore SFTP) sono elencate all'inizio dei registri DEBUG.

Remote version string: SSH-2.0-OpenSSH_8.8Local version string: SSH-2.0-JSCH-0.1.54

Empiricamente, per procedere ciascuna delle categorie di algoritmo negoziate (menzionate nella RFC) deve avere almeno un'implementazione in comune tra client e server (e soddisfare i relativi vincoli).

RFC 4253: Algorithm Negotiation      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
Pertanto, ogni riga rappresenta un elenco di algoritmi offerti da server e client. Anche se per un solo algoritmo del server non esiste un algoritmo corrispondente offerto dal client, la negoziazione non riesce. Nell'esempio che segue, gli algoritmi offerti per "server_host_key_algorithms" non corrispondono a quelli offerti dal client e la negoziazione non riesce.
  Errore per l'algoritmo SFTP

Scenario 1 (algoritmo di compressione)

Il connettore SFTP attualmente non supporta la compressione "zlib" e, di conseguenza, l'unico algoritmo che può essere concordato con il lato server è "NONE". È stata presentata una richiesta di ottimizzazione tramite il nostro portale delle idee  

Al momento sono disponibili le seguenti alternative:

  1. Configurare il server SFTP per consentire le connessioni senza compressione (presentando l'algoritmo "NONE" come abilitato). 
  2. Sviluppare un connettore personalizzato tramite Java SKD/DeviKit(Mule 3.x) o un programma Java che utilizza il modulo Java per connettersi al server SFTP in questione tramite una libreria che consenta questa funzione.

Scenario 2 (mancata corrispondenza della crittografia)

a. Verificare che la libreria JSCH utilizzata supporti i tipi di crittografia che si desidera utilizzare

Il connettore SFTP utilizza la libreria JSCH per stabilire una connessione a un server SFTP. JSCH dispone di una serie di tipi di crittografia supportati descritti nella documentazione, a seconda della versione utilizzata. È possibile vedere le funzioni incluse nel ChangeLog di JSCH

  • Nel caso di Mule Runtime 4.x, la libreria è in bundle con ogni rilascio del connettore SFTP ed è possibile accedere facilmente alla sua versione tramite Package Explorer in Anypoint Studio.

Esempio:


Package Explorer in Anypoint Studio

  • In Mule Runtime 3.x, la libreria è in bundle con il runtime stesso ed è possibile trovarla cercando nella directory /lib/opt un file.jar che inizi con il prefisso "jsch-".

Se la libreria non fornisce il supporto per i tipi di crittografia in questione, sarà necessario abilitare uno o più dei tipi di crittografia inclusi tra quelli supportati da quella versione JSCH nel server SFTP.

IMPORTANTE: La modifica della libreria in uso non è consigliata poiché il comportamento del connettore SFTP è stato testato e convalidato con la versione inserita nel bundle. Nel caso in cui si desideri tentare questa operazione, procedere in un ambiente inferiore e, se possibile, verificare con l'assistenza MuleSoft se la versione JSCH è compatibile.

b. Verificare che i tipi di crittografia siano abilitati per l'uso a livello di JVM. 

Dietro le quinte, il connettore SFTP utilizza la libreria JSCH per connettersi a un server SFTP. Questa libreria, in ultima analisi, si basa su Java(TM) Cryptography Extension (JCE). In alcune JVM, alcuni tipi di crittografia potrebbero non essere inclusi per l'uso a causa di restrizioni di controllo. Verificare se questi limiti sono validi per la JVM in uso in base alla documentazione del fornitore.

Ad esempio, se si utilizzano JVM Oracle, è necessario aggiungere JCE Unlimited Strength per consentire alcuni tipi di crittografia e ogni versione Java ha un pacchetto e dettagli di installazione specifici per la propria JCE.

Nel caso di JDK8 è possibile fare riferimento a:

Criteri e dettagli di installazione di Unlimited Strength e file dei criteri JCE Unlimited Strength.

Dichiarazione di non responsabilità: Questa soluzione rappresenta un suggerimento da prendere in considerazione in combinazione con i propri casi d'uso e i propri requisiti specifici e non rappresenta una soluzione completa per tutte le circostanze.

Numero articolo Knowledge

001121369

 
Caricamento
Salesforce Help | Article