Firmar commits nun repositorio

Introducción

Supoñamos que queremos contribuir nun repo e queremos que os nosos commits aparezan, non só co nome, se non cun selo que verifique que realmente fomos nós os contribuidores. Para isto imos recorrer a GPG. Partimos deste outro artigo, no que xa explicamos como xerar as claves. Se non as tes, bota un ollo antes de seguir.

Neste artigo imos configurar as claves para traballar con Codeberg. Os pasos para facelo noutras webs son moi similares, así que o aquí descrito tamén funcionará. Á excepción a isto é Bitbucket, que non amosa as sinaturas dos commits, a lo menos no momento de escribir este artigo.

Engadindo a nosa clave a un repositorio

Unha vez logueados en Codeberg, clicamos na icona do noso usuario e entramos na configuración. Despois imos ao apartado SSH / claves GPG e no apartado de claves GPG clicamos en Añadir clave. Aquí temos que pegar a nosa clave pública, que é a que comeza por uns guións seguidos de BEGIN PGP PUBLIC KEY BLOCK. Se non está exportada, podese obter con gpg --armor --output arquivo_de_saida.txt --export teu@email.ext. Sendo este último o email co que rexistrache a clave, ou tamén podes usar o ID que deche de alta como nome. Copiamos o contido do ficheiro no cadro de texto que nos presentaba a web e damoslle a Añadir clave.

Unha vez engadida continuamos dándolle á opción de verificar. Aquí aparécenos un comando que temos que pegar na nosa terminal, o que comeza por echo. Ao pola vainos pedir que poñamos a nosa frase segreda. Copiamos a saída e pegámola no cadro de texto que nos presenta a web. Se todo foi ben, teremos a nosa clave verificada.

Vincular a clave con git para poder asinar os commits

Para isto imos amosar a nosa key para coller o dato que nos fai falla o sec. Farémolo con gpg --list-secret-keys --keyid-format LONG teu@email.ext, outra vez co email asociado á clave. Isto sacará unha saída como a seguinte:

sec   rsa4096/30F2B65B9123B6CA 2022-08-18 [SC]
      D5E4F29F32ABCC0CDA8FFC8123F2B65B9246B6CA
uid                   [ultimate] Nome da conta <email>
ssb   rsa4096/B7ABC08AB14028C0 2022-08-18 [E]

Desta saída temos que copiar da primeira liña a cadea que vai despois de rsa4096/ e a data seguinte. Esa será a ID da nosa clave. Agora para vinculala a git executamos git config --global user.signingkey <key id> mudando <key id> pola que copiamos antes. NOTA: se nos dá algún erro do estilo secret key not available ou gpg: signing failed: secret key nos available, teríamos que usar gpg2 en troques do gpg. O comando sería o seguinte git config --global gpg.program gpg2.

Con isto xa está a nosa clave vinculada con git, pero non se firman os commits que fagamos aínda. Neste punto podemos firmar os commits de dous xeitos, a man ou automáticamente.

  • A man: teremos que engadir o flag -S cando queiramos firmar, por exemplo: git commit -S -m "isto é un commit firmado con gpg".
  • Automáticamente: para non ter que lembrarnos sempre de engadir o flag teremos que configuralo no git. Eu fagoo para todo-los meus proxectos, así que o fago de xeito global: git config --global commit.gpgsign true. Se o queremos facer nun só proxecto, omitiremos o flag –global.

NOTA 2: Ao facer isto a min non me deixaba firmar os commits, nin co IDE nin dende a consola. O problema era que ao usar KDE non se lanzaba o prompt no que escribir a frase segreda para a clave. Así que tiven que instalar o pinentry adecuado, no meu caso foi simplemente executar sudo apt install pinentry-qt.

Extra, claves SSH

Está moi ben isto de firmar os commits, pero tamén é interesante traballar cun repositorio por SSH e non por HTTPS. Isto vainos dar un extra de seguridade. Para isto temos que xerar, se non o temos aínda, un par publico/privado de claves. Isto farémolo con ssh-keygen -t rsa. Ao pulsar enter vainos pedir o arquivo de destino, no meu caso como non teño ningunha previa vouno deixar no arquivo por defecto. Así que pulso enter, sen introducir nada. Despois pídenos un contrasinal. Aquí xa é cousa de cada quen. Se realmente estamos seguros de que ninguén se vai facer ca nosa clave privada, non será necesario. Aforraranos escribir a clave cada vez que a usemos, pero perdemos algo de seguridade. Isto axilizará as conexións, xa que como dixen non haberá que escribila cada vez que vaiamos por SSH. No caso de conectarnos de cando en cando a un server, non sería para tanto. Pero se engadimos a clave a un repositorio, pode ser un pouco tedioso que no-la estea a pedir cada vez que fagamos un commit. Aínda que algúns IDEs van recordar a clave e tamén nos aforrarán isto. Así que o dito, cousa de cada quen. Eu son máis de ter a clave.

Unha vez feito isto, para utilizar a clave nun repo copiamos o contido do ficheiro público e pegaremos o contido na configuración do noso usuario. En Codeberg, será no apartado SSH / claves GPG. Na sección de Gestionar Claves SSH. Pulsamos Añadir clave, dámoslle un nome e pegamos no cadro de texto a clave. Por último engádimola. A continuación imos verificar a clave. Para isto pulsamos en verificar, copiamos o comando que comeza por echo e pegámolo na nosa terminal, mudando a ruta que aparece ao final pola que apunta ao noso arquivo .pub. Copiamos a saída e pegámola no cadro de texto. Verificamos, e se todo foi ben, pois xa temos a mensaxe de confirmación.

Conclusión

Pois ata aquí este artigo. Con estes pasos asegurámonos de que non se nos poida suplantar de xeito doado, xa que firmamos as nosas contribucións e non usamos só o nome. O nome e o correo van configurados en git sen verificar, polo que calquera podería facer commits usando os nosos datos deixando a dúbida de se fomos nós. Ao firmar os commits isto xa non será posible. Por último utilizar as claves SSH tamén da ese extra de seguridade ao usar un protocolo máis seguro co que conectarnos aos nosos sevidores.