Jenkins: ¿cuál es el formato correcto para la clave privada en Credenciales?
Estoy creando un trabajo en Jenkins 2.152 que se ejecuta en Windows Server 2016 y que debe extraerse de un repositorio de git alojado en bitbucket.org. Probé la clave ssh a través de git-bash para saber que funciona y que no hay una frase de contraseña. Cuando intento utilizar la misma clave privada con Jenkins, aparece un mensaje de error.
Failed to connect to repository : Command "git.exe ls-remote -h
[email protected]:mygroup/myrepo HEAD" returned status code 128:
stdout:
stderr: Load key
"C:\\Users\\JE~1\\AppData\\Local\\Temp\\ssh2142299850576289882.key": invalid format
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
Las Credenciales están configuradas como
scope: Global
user: git
Private Key -> Enter Directly -> copy and past - generated by ssh-keygen -t rsa in gitbash
Passphrase: empty
ID: empty
description: bitbucket.org
Noté que en otro servidor Windows Jenkins la clave privada tiene una cantidad diferente de caracteres por línea.
¿Alguien sabe cuál es el formato esperado de clave privada en las credenciales de Jenkins? O tal vez haya algo más que pueda comprobar.
Cualquier ayuda es muy apreciada.
Verifique la versión de Git para Windows que está utilizando: A partir de 2.19.2 , viene con OpenSSH v7.9p1 (desde 7.7 anterior)
Y... openssh 7.8 acaba de cambiar el formato ssh-keygen predeterminado, de un PEM clásico de 64 caracteres a un OPENSSH de 70 caracteres.
Sólo ssh-keygen -m PEM -t rsa -P "" -f afile
generaría el formato antiguo ( -m PEM
)
ssh-keygen(1)
:escriba claves privadas en formato OpenSSH de forma predeterminada en lugar de utilizar el formato PEM de OpenSSL.
El formato OpenSSH, compatible con las versiones de OpenSSH desde 2014 y descrito en el
PROTOCOL.key
archivo de la distribución fuente, ofrece una protección sustancialmente mejor contra la adivinación de contraseñas sin conexión y admite comentarios clave en claves privadas.
Si es necesario, es posible escribir claves antiguas de estilo PEM agregando "-m PEM
" a los argumentos de ssh-keygen al generar o actualizar una clave.
También recibí este mensaje de error y finalmente descubrí que la credencial de Jenkins debería ser una clave secreta RSA, no una clave pública. A continuación se detallan mis pasos para configurar Jenkins para clonar desde bitbucket:
- Agregar credencial en credenciales de Jenkins
Kind: SSH username and private key Scope: Global Username: <my username in bitbucket> Private key: <Enter directly> -----BEGIN RSA PRIVATE KEY----- ...... -----END RSA PRIVATE KEY-----
- Cree un trabajo y configure la ruta del repositorio y la credencial de la siguiente manera:
Al final, no pude encontrar una manera de hacer que funcionara pegar claves privadas en las credenciales de Jenkins.
Si bien puede que sea de conocimiento común para muchos, decidí incluir la solución a continuación de todos modos.
Esto es lo que hice como solución alternativa para extraer mis repositorios privados de Bitbucket.org:
- Inicie sesión en su host de Windows como el usuario que ejecuta el servicio Jenkins. En mi caso, el servicio Jenkins se ejecuta como un usuario dedicado porque necesitaba acceder a recursos compartidos de red con privilegios de escritura restringidos únicamente a este usuario.
- Abra Git-bash y genere claves SSH con
ssh-keygen
un comando que acepte todos los valores predeterminados - En Jenkins, ingrese la URL del repositorio de git como [email protected] :team_name/repo_name y deje las credenciales como
None
De esta manera, Git y SSH podrán encontrar claves SSH en la ubicación predeterminada, que generalmente es c:\Users\username.ssh\
Espero que esto ayude a alguien.
Entonces, solo para agregar una respuesta para convertir una clave del nuevo formato OPENSSH al formato PEM anterior:
$ ssh-keygen -f blah.key
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in blah.key.
Your public key has been saved in blah.key.pub.
The key fingerprint is:
SHA256:ndMFvZjbD7M3MoqFy8+me74gPhcuoDVLF2/Oh+hXQ8I [email protected]
$ head -n 1 blah.key
-----BEGIN OPENSSH PRIVATE KEY-----
$ ssh-keygen -f blah.key -m PEM -p
Key has comment 'redacted'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
$ head -n 1 blah.key
-----BEGIN RSA PRIVATE KEY-----
ssh-keygen -p cambia la frase de contraseña, pero no le importa que la nueva frase de contraseña sea la misma (incluso ninguna) que la anterior y en el proceso puede convertir el formato.
lo siguiente funcionó para mí
Cree una carpeta (digamos testkey), cd dentro de la carpeta y haga clic derecho y seleccione git bash
ahora cree la clave OPENSSH usando el siguiente comando en git bash. aquí test.key es el nombre de su clave OPENSSH (tenga en cuenta que la frase de contraseña es opcional)
ssh-keygen -f prueba.clave
- Copie esa clave de conexión, puede abrir la clave usando el bloc de notas y pegarla en github. Recuerde que Git solo acepta la clave OPENSSH.
- Ahora convierta esa clave al formato PEM, usando la misma ventana bash, ejecute el siguiente comando (tenga en cuenta que la frase de contraseña es opcional)
ssh-keygen -f prueba-pem.key -m PEM -p
Ahora la clave se convierte en clave PEM, copie el contenido de la clave usando el bloc de notas.
Vaya a Jenkins -> Credenciales -> Agregar nuevas credenciales.
7.Seleccione Tipo de nombre de usuario y clave SSH, Proporcione el nombre de usuario y pegue el contenido de la clave PEM copiado en el paso 5 y péguelo en la clave privada; tenga en cuenta que la frase de contraseña es opcional.
- Ahora agregue repositorio para ssh como este,
Comando SSL original copiado de GITHUB - [email protected] :test/goto.git
change it to - ssh://[email protected]/test/goto.git