W tym artykule zostanie przedstawiony sposób na wykorzystanie kluczy GPG jeśli chodzi o działania przeprowadzane na githubie. Będziemy w ten sposób w stanie podpisać swoje commity czy tagi, by było wiadomo czy zmiany, które zostały poczynione, tak naprawdę pochodzą od nas. Oczywiście to może się wydać przesadą dla wielu ludzi ale skoro jest możliwość wykorzystania kluczy GPG, to czemu z tego nie skorzystać?

Jak można się domyśleć, potrzebne będą nam klucze GPG ale sposób ich tworzenia oraz konfiguracja systemu nie zostaną tutaj opisane. To zostało z robione w tym artykule [1].

Jeśli mamy już wygenerowane klucze, możemy przejść do działania.

1. Definiowanie klucza

Plik konfiguracyjny gita ma sporo użytecznych opcji. Jedną z nich jest ta odpowiadająca za sprecyzowanie klucza, którym będziemy podpisywać pewne rzeczy. Rozchodzi się oczywiście o user.signingkey . By dodać odpowiedni wpis, listujemy pierw prywatne klucze szyfrujące:

$ gpg --list-secret-keys
/home/morfik/.gnupg/secring.gpg
-------------------------------
sec   4096R/0x72F3A416B820057A 2014-08-08
Key fingerprint = 9F30 BD23 F4A2 3921 5E29  A3B6 72F3 A416 B820 057A
uid                            Mikhail Morfikov <morfik@nsa.com>
ssb   4096R/0x46DF79598289C782 2014-08-08

Teraz wpisujemy w terminal poniższą linijkę:

$ git config --global user.signingkey 0x72F3A416B820057A

Spowoduje to dodanie do pliku konfiguracyjnego gita (~/.gitconfig) odpowiednich wpisów -- można oczywiście ręcznie wyedytować ten plik i dodać poniższą zwrotkę:

[user]
...
signingkey = 0x72F3A416B820057A

Od tej pory, git (jeśli poproszony o to) będzie podpisywał tagi oraz commity.

2. Podpisywanie tagów

Spróbujmy zatem coś podpisać. Na początek tagi:

$ git tag -s v1.0 -m 'morfiprojekt'

You need a passphrase to unlock the secret key for
user: "Mikhail Morfikov <morfik@nsa.com>"
4096-bit RSA key, ID 0x72F3A416B820057A, created 2014-08-08

Jak widać, zostaliśmy poproszeni o hasło do klucza. Popatrzmy zatem na sam tag:

$ git show v1.0
tag v1.0
Tagger: Mikhail Morfikov <morfik@nsa.com>
Date:   Mon Feb 16 17:48:13 2015 +0100

morfiprojekt
-----BEGIN PGP SIGNATURE-----

iQIcBAABCgAGBQJU4h9NAAoJEM0EaBB3G2UgsuMQAKtAx9m/bG4zCtsrSH5Mq832
+P6YPkZMqbnXCITVRy7HqVigFDunYtGXu5Y6ZfUYV+kjRlAXMnMQHYFghwVej7cu
Os3WEu2OFs1sbyzSgUkpVlVcHsjO4TjoKoZum7Wgk3IIzONdreyv8nrYsNjiPb5F
UTdu5ERb/AHExzS2wS6MXdBl/PtAY8b+o2vdWahhuZ5nIHC2F5GK6m05Dhkr6LvE
2ikO4pKZY+/toDV9Q1xalUDIloaeB5pcB+2VOuLBQYKT8OaVjfSt9vH6ZrJbe7SE
oJ7cSIMRhPbqz5kCqEoYesOoOA6J75FaeWiEx0DNHlegnVg6CqkSwPyeeccVrY4H
hslNYEf3lEGWV4HakwuOZFq1Rx+R6D/vnMCoFED/S56W2GLIv7HfPveb3AW+1Pap
rFbZ0SGIarSePLUF+qkvD53qeQ5HoV05laCKIUp9D93ybryjA6YiMib8sylh7DOr
GwWuLi06hpzQw4QN1Vj8Cmw900J8MB5GpW7NoxN00NBz6sWNpnBeDmBpS77tcyOy
KGyrGO5MzCfIKA79jJaBBSUB9h3G94haNDoYPbMrv3x6Sx8CIsDds8cQ+YSDlnKS
94Kf7yJ/9QNiX15dmo8j21+oIjQlaoq9aX2TtvxND4ELJhIE0ulIobU5xZy1Bc0d
Gc7txjpF4eQsOQh+l4Ka
=7UmQ
-----END PGP SIGNATURE-----

Widzimy, że została dodana do niego sygnatura. Zweryfikujmy ją zatem. Do tego celu potrzebny będzie klucz publiczny tej osoby co ten tag podpisała, a sam proces weryfikacji wygląda jak poniżej:

$ git tag -v v1.0
object 75f7bdc3ef9f6846371cf24604a53f5d9d9e51ad
type commit
tag v1.0
tagger Mikhail Morfikov <morfik@nsa.com> 1424105293 +0100

morfiprojekt
gpg: Signature made Mon 16 Feb 2015 05:48:13 PM CET
gpg:                using RSA key 0x72F3A416B820057A
gpg: Good signature from "Mikhail Morfikov <morfik@nsa.com>" [ultimate]
Primary key fingerprint: 9F30 BD23 F4A2 3921 5E29  A3B6 72F3 A416 B820 057A

Wygląda dobrze.

3. Podpisywanie commitów

No to teraz spróbujmy podpisać commita:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)

jakis_tam_plik_testowy

nothing added to commit but untracked files present (use "git add" to track)

$ git add .

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file:   jakis_tam_plik_testowy

$ git commit -a -S -m 'test podpisu commita'
You need a passphrase to unlock the secret key for
user: "Mikhail Morfikov <morfik@nsa.com>"
4096-bit RSA key, ID 0x72F3A416B820057A, created 2014-08-08

[master 2332031] test podpisu commita
1 file changed, 1 insertion(+)
create mode 100644 jakis_tam_plik_testowy

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working directory clean

I teraz już tylko zostało zweryfikowanie podpisu:

$ git log --show-signature -1
commit 23320312843f5631dd15851eb61483ef3a4491a4
gpg: Signature made Mon 16 Feb 2015 06:15:29 PM CET
gpg:                using RSA key 0x72F3A416B820057A
gpg: Good signature from "Mikhail Morfikov <morfik@nsa.com>" [ultimate]
Primary key fingerprint: 9F30 BD23 F4A2 3921 5E29  A3B6 72F3 A416 B820 057A
Author: Mikhail Morfikov <morfik@nsa.com>
Date:   Mon Feb 16 18:15:29 2015 +0100

test podpisu commita

I tutaj również wszystko przebiegło pomyślnie.

Więcej informacji na temat wykorzystania kluczy GPG w przypadku gita można znaleźć tutaj [2].


Przypisy:

  1. https://dug.net.pl/tekst/297/bezpieczna_konfiguracja_gpg/
  2. http://git-scm.com/book/en/v2/Git-Tools-Signing-Your-Work#_signing