Descargo de responsabilidad: Este no es un post relacionado con las finanzas :)
En estos tiempos de APIs por todas partes, puede parecer un anacronismo el uso de SFTP para conectarse a un servidor remoto y obtener una lista de archivos para intercambiar información, pero en el mundo financiero (tristemente) es más común de lo que crees.
En mi proyecto actual tengo que conectarme a un servidor remoto a través del Protocolo de Transferencia Segura de Archivos (también conocido como SFTP) utilizando un nombre de usuario, una clave privada RSA y una frase de contraseña. Una vez conectado, el objetivo es leer algunos archivos de una carpeta remota y descargarlos a una carpeta local.
Para lograr esto te recomiendo usar SSH.NET, una de las librerías SSH más populares para .NET, disponible en nuget.
Más información sobre SSH.NET aquí.
La parte más difícil aquí es configurar la conexión, como siempre. Necesitamos proporcionar la url y el puerto del servidor, en combinación con el nombre de usuario y un archivo que contenga la clave privada del certificado RSA, y -por supuesto- la frase de paso.
Aquí está el código final, y simplemente funciona :)
Fíjate en la línea resaltada (7). La clave aquí es crear un archivo que contenga la privateKey. Te recomiendo usar filezilla o similar para probar la conexión y guardarla en un archivo. Tu archivo debería ser algo así:
PuTTY-User-Key-File-2: ssh-rsa
Cifrado: aes256-cbc
Comentario: rsa-key-KBL-20171006
Líneas públicas: 6
AAB3NzaC1yc2EAAAJQAAAQEAnHp1CA4xF04ZdOQ/rsxJoW9fPJ2RD
FgMNVIqsUsjeRbIoZ2y8SMD9b7MMB0lpKXgJ2dYDgOnh2q
j4VTpEoI2JWh4NdQgSH0O+2oLmQnwgDPT7Kva095ggEQiqScX4+31aY02/nz
mK86sxq/sUsW/UqgS+pPViRQLVzDXF8XIYSSZngmV+Rk108BQ==
Privado-Líneas: 14
khHfZWB0vBIFtKc4s98xGDFhwZNJQByUTtE7um0tcU4cwy1QTPf3GIuN
vyhHxIGx3LBtFJqzbZVJtOJVSYjkBTGbNc62D0uJCxYVf8PUUStI6GbOkkyDW/Vt
beWZ3s/DugsImjcbPxdEz/2X86uzd5U5v4/wGKQr8GWJtNksMcJ
k7JgRYGA/t0cSE2980MxhZOBg2Gn7+0A6mWgSf2Rr7hpcqsou1
hmc1HYtN7Oj4WT7hvRt8ZAC3/ekTdJ4K3K7vKglSHoQ
tnimHaanJHz4RGBb78Alllk+OYk3TN0Etcwod3401cLpjYeq6veZLA/KfCHuiJ+
+Zqoy//NY9egfXd1hB0kmiemwO8wGfLS7ppS/WvPOknW9I8SNMllR1vmO3Hk6S3x
KfAG03ZWNoKDLvAIUllNyMpf9p8oKLF2ny4bJKsfNtr4Y0ejQJUFkC
uNz1S4VJ8j1fRcIjx4yT121B9Dfp486RUmnEgsOFEtmVyHPfNxYzDXq2MjTf4l/
MI5cKWHrDbDC/Cu3YvkF3gekLAb/j9Cie/feHmSnbuZ2VEr6zUt10yaH4hPejCOw
FYDZb0I8xxxWJZ6BpLWDqeD0Oiss8UnDhha/iKvodA9LIG0T
VRlScvGvuzClGYkc7UIWIoARvdxp46YlGu4mWGeVkNcrxXnmUkdKyNqGjAGJoK/
Privado-MAC: d288fffe72914eb62ed60a7e50fd8ce775
He pasado mucho tiempo antes de que funcione recibiendo una excepción SSH "Archivo de clave privada no válido", pero el mismo archivo de clave funciona bien cuando se utiliza la aplicación Filezilla para conectarse, así que #WhatTheHell está pasando 😬
Finalmente me di cuenta de que esto se debe a que la clave privada debe ser compatible con SshNet, por lo que tenemos que convertir la clave privada utilizando el generador de claves PuTTY (en mi caso, la misma aplicación que utilizamos para crear el certificado). Una vez abierto en PuTTY, sólo hay que exportar la clave del archivo a OpenSSH y utilizar este nuevo archivo ppk en lugar del anterior.
Si abre el nuevo archivo, verá que el archivo de claves ahora comienza con:
--INICIO DE CLAVE PRIVADA RSA--
Y termina con:
--FIN DE LA CLAVE PRIVADA RSA--
Ahora esta es una clave privada SSH válida y debería funcionar como un encanto ;)
¡Felicidades en el bacalao!