es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo leer una clave privada encriptada en un productor de SFTP?

Estoy tratando de cargar un archivo en un servidor sftp utilizando una clave pública. Tengo la clave privada en mi proyecto que generé a través de ssh-keygen con una contraseña establecida. He intentado lo siguiente:

public void configure() throws Exception {
        var connection =
                sftpProperties
                        .getSftpForEntity("target")
                        .orElseThrow(SftpProperties.noSuchEntity("target"));

    var privateKey = ArrayUtils.toObject(Files.readAllBytes(Path.of("src/main/resources/id_rsa")));

    from(
            file("test")
    )
            .to(
                    sftp(connection.getConnectionString("/hello"))
                            .username(connection.getUser())
                            .privateKeyPassphrase("pass")
                            .privateKey(privateKey)
            );
}

}

org.apache.camel.component.file.GenericFileOperationFailedException: No se puede conectar a sftp://arcapptest@us2.hostedftp.com:22
...
Caused by: com.jcraft.jsch.JSchException: clave privada no válida: [B@71068da
```

Parece ser que la frase de contraseña no se está aplicando. También he intentado lo siguiente:


.to(
sftp(floridaConnection.getConnectionString("/hello"))
.username(floridaConnection.getUser())
.privateKeyPassphrase("pass")
.privateKeyFile("src/main/resources/id_rsa")
);

con el mismo resultado.

He intentado utilizar la clave privada sin encriptar, y eso funciona.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Descripción del problema

    El usuario está intentando cargar un archivo en un servidor sftp utilizando una clave privada generada a través de ssh-keygen que tiene una frase de contraseña configurada. La clave privada se almacena en el proyecto. Sin embargo, al intentar conectarse al servidor sftp, se produce un error que indica que la clave privada es inválida.

    Solución

    Parece que el problema está en la aplicación de la frase de contraseña. El primer intento utiliza el método privateKeyPassphrase(), pero parece que no funciona. El segundo intento utiliza el método privateKeyFile(), que podría funcionar si el archivo de clave privada no está encriptado.

    Para resolver este problema, una opción es utilizar una clave privada no encriptada. Alternativamente, se puede utilizar la biblioteca JSch para cargar la clave con la frase de contraseña. Aquí tienes un ejemplo:

    ...
    import com.jcraft.jsch.JSch;
    import com.jcraft.jsch.KeyPair;
    
    ...
    
    public void configure() throws Exception {
        var connection = sftpProperties.getSftpForEntity("target")
                .orElseThrow(SftpProperties.noSuchEntity("target"));
    
        var privateKeyFile = "src/main/resources/id_rsa";
        var passphrase = "passphrase";
    
        JSch jsch = new JSch();
        KeyPair keyPair = KeyPair.load(jsch, privateKeyFile, null);
    
        if (keyPair.isEncrypted()) {
            keyPair.decrypt(passphrase);
        }
    
        byte[] privateKey = keyPair.getPrivateKey();
    
        from(file("test"))
                .to(sftp(connection.getConnectionString("/hello"))
                        .username(connection.getUser())
                        .privateKey(privateKey));
    }
    

    Aquí, se utiliza la biblioteca JSch para cargar la clave privada desde el archivo y aplicar la frase de contraseña para desencriptarla si está encriptada. Luego, se utiliza el método privateKey() para pasar la clave al punto de conexión sftp de Camel.

    Ten en cuenta que KeyPair debe cerrarse después de su uso para liberar recursos:

    keyPair.dispose();
    

    Esta solución debería funcionar tanto con claves privadas encriptadas como sin encriptar.

Comments are closed.