Git 101 #2 – GitHub’da Commit’lerin GPG ile İmzalanması

Bir önceki yazımda, GitHub tarafında SSH key ile authentication‘dan bahsetmiştim. Bu yazıda ise GPG kullanarak commit’lerimizi imzalamayı deneyeceğiz.

İmzaladığımız commit’ler, GitHub üzerinde “verified” etiketine sahip olacaklar. Bu sayede, commit’lerimizin güvenilirliğini arttırmış olacağız.

Var Olan Anahtarların Tespiti

İlk olarak hâli hazırda bir GPG anahtarı üretip üretmediğimize bakalım. Daha önce bu cihazda GPG ile ilgili herhangi bir işlem yapmadığım için bir “initialization” süreci görüyoruz. İkinci komutumuzda ise hem public hem de private parçasına sahip olduğumuz anahtarları listeliyor.

Bu çiftten private olan, commit’lerimizi imzalamamızı sağlayacak. Public ise GitHub ile paylaşılacak. Fakat göreceğiniz üzere, henüz ortada bir anahtar çifti yok:

[root@localhost ShellScripting101]# gpg --list-secret-keys
gpg: dizin `/root/.gnupg' oluşturuldu
gpg: yeni yapılandırma dosyası `/root/.gnupg/gpg.conf' oluşturuldu
gpg: UYARI: `/root/.gnupg/gpg.conf' deki seçenekler bu çalıştırma sırasında henüz etkin değil
gpg: `/root/.gnupg/secring.gpg' anahtarlığı oluşturuldu
gpg: `/root/.gnupg/pubring.gpg' anahtarlığı oluşturuldu
gpg: /root/.gnupg/trustdb.gpg: güvence veritabanı oluşturuldu
[root@localhost ShellScripting101]# gpg --list-secret-keys --keyid-format LONG
[root@localhost ShellScripting101]#

GPG Anahtar Çifti Oluşturma

Başlamadan önce şunu belirtmekte fayda var. GitHub tarafında commit’lerinizi imzalamak istiyorsanız öncelikle kendinizi doğrulamanız gerekiyor. Bu nedenle GitHub e-posta adresinizi doğrulamış olmalısınız.

GPG anahtar çiftimizi oluşturalım. Oluşturalım oluşturmasına fakat GitHub’daki doküman benim işime yaramadı açıkçası.

GPG versiyonumuzu kontrol edelim:

[root@localhost ShellScripting101]# gpg --version
gpg (GnuPG) 2.0.22
libgcrypt 1.5.3
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: ~/.gnupg
Desteklenen algoritmalar:
GenAnah: RSA, ?, ?, ELG, DSA
Şifre: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
       CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Sıkıştırma: Sıkıştırılmamış, ZIP, ZLIB, BZIP2

GitHub der ki; “GPG 2.1.17 sürümü ve üzerindeysen gpg –full-generate-key çalıştır. Değilsen, gpg –default-new-key-algo rsa4096 –gen-key çalıştır.

[root@localhost ShellScripting101]# gpg --full-generate-key
gpg: geçersiz seçenekler "--full-generate-key"
[root@localhost ShellScripting101]# gpg --default-new-key-algo rsa4096 --gen-key
gpg: geçersiz seçenekler "--default-new-key-algo"

Çalıştırdım, sonuç yukarıdaki gibi. Burası referans olsun, denemenizi öneririm. Belki bende bir hata vardır. Fakat ben bildiğim gibi devam edeceğim:

[root@localhost ShellScripting101]# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Lütfen istediğiniz anahtarı seçiniz:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (yalnız imzalamak için)
   (4) RSA (sadece imzalamak için)
Seçiminiz? 1
RSA anahtarları 1024 bit ile 4096 bit arasında olmalı.
İstediğiniz anahtar uzunluğu nedir? (2048) 4096
İstenen anahtar uzunluğu: 4096 bit
Lütfen anahtarın ne kadar süreyle geçerli olacağını belirtin.
         0 = anahtar süresiz geçerli
      <n>  = anahtar n gün geçerli
      <n>w = anahtar n hafta geçerli
      <n>m = anahtar n ay geçerli
      <n>y = anahtar n yıl geçerli
Anahtar ne kadar geçerli olacak? (0) 0
Anahtar hep geçerli olacak
Bu doğru mu? (e/H ya da y/N) y

GnuPG anahtarınızı betimlemek için bir kullanıcı kimliği oluşturmaya ihtiyaç duyuyor.

Adınız ve Soyadınız: Test Kullanıcısı
E-posta adresiniz: example@example.com
Önbilgi: Açıklama kısmı
`utf-8' karakter kümesini kullanıyorsunuz.
Seçtiğiniz KULLANICI-KİMLİĞİ:
    "Test Kullanıcısı (Açıklama kısmı) <example@example.com>"

(A)dı ve Soyadı, (Y)orum, (E)posta alanlarını değiştir ya da (T)amam/Çı(k)? T
Gizli anahtarınızı korumak için bir Anahtar Parolanız olmalı.

Bir miktar rasgele bayt üretilmesi gerekiyor. İlk üretim sırasında biraz
hareket (klavyeyi kullanmak, fareyi hareket ettirmek, disklerden yararlanmak)
iyi olacaktır; bu yeterli rasgele bayt kazanmak için rasgele sayı
üretecine yardımcı olur.

Sırayla inceleyelim:

  • GPG anahtar çifti oluşturmak istediğimizi belirttik.
  • Anahtar seçimi sordu. RSA çiftini seçtim (1).
  • Kaç bitlik bir anahtar istediğimiz sordu. 4096 ile devam ediyoruz.
  • Anahtarın expire olma süresini sordu. Süresiz (0) seçtim.
  • Kişisel bilgilerimizi doldurduk.
  • Herhangi bir düzenleme yapmak istemedik. Verdiğimiz bilgiler doğru. (T)amam diyerek işleme devam ediyoruz.
  • Ve güzel bir nokta denk geliyor önümüze…

Anahtar çiftinin oluşturulabilmesi için, yukarıda da görüldüğü gibi, bilgisayarımızda entropi oluşturmamız gerekiyor. Lâkin ben GUI’siz bir cihaz kullanıyorum. Fareyi hareket ettiremem. Klavyeden nereye kadar entropi üretebilirim? Yapabileceğim tek şey diski kullanmak. Peki nasıl? Yeni bir shell’e geçtip şöyle yapabilirim mesela:

[root@localhost ~]# dd if=/dev/sda of=/dev/zero

Diskimdeki her şeyi al, “/dev/zero”ya bas. Bu komut sayesinde diskimizin bir kopyasını, hiç olmayan bir yere almaya çalışıyormuşuz gibi düşünebiliriz. Eğer GPG anahtar çiftinizi oluştururken entropi beklemek durumunda kalırsanız, bu yöntemi kullanabilirsiniz. Bir süre sonra gerekli entropi sağlanacaktır. Bu arada konsol çıktısında “rasgele” yazıyor ama, “rastgele” değil miydi o? Bir ara çeviri düzenlemesi gönderelim GPG için.

GPG key üretimi sırasında entropi sağlanması
GPG key üretimi sırasında entropi sağlanması

Gerekli entropi sağlandıktan sonra karşımıza şu çıktı geliyor:

gpg: anahtar 5B4BD21A son derece güvenli olarak imlendi.
genel ve gizli anahtar üretildi ve imzalandı.

gpg: güvence veritabanı denetleniyor
gpg: 3 şöyle böyle gerekli, 1 tamamen gerekli, PGP güvence modeli
gpg: derinlik: 0  geçerli:   1  imzalı:   0  güvenilir: 0-, 0q, 0n, 0m, 0f, 1u
pub   4096R/5B4BD21A 2021-01-26
     Anahtar parmakizi = 5AD3 50C9 BE05 5118 029F  852D 160F E384 5B4B D21A
uid                  Test Kullanıcısı (Açıklama kısmı) <example@example.com>
sub   4096R/28F5B944 2021-01-26
[root@localhost ~]# gpg --list-secret-keys --keyid-format LONG
/root/.gnupg/secring.gpg
------------------------
sec   4096R/160FE3845B4BD21A 2021-01-26
uid                          Test Kullanıcısı (Açıklama kısmı) <example@example.com>
ssb   4096R/DF8DAD0828F5B944 2021-01-26

Görüldüğü üzere, anahtar çiftimiz başarıyla oluşturuldu.

Bu arada şunu da ekleyeyim. Aşağıdaki gibi bir ekran karşınıza çıkacaktır. Burada da anahtarınız için passphrase yazmanız bekleniyor:

GPG key passphrase ekranı
GPG key passphrase ekranı

Anahtarları listelediğimiz ekranda “sec” kısmında bir ID göreceksiniz. Bu ID’yi kullanarak aşağıdaki komutu çalıştırdığınızda, public anahtarınızın içeriğini görebilirsiniz:

[root@localhost ~]# gpg --armor --export 160FE3845B4BD21A
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

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
=SNYO
-----END PGP PUBLIC KEY BLOCK-----

Yukarıdaki çıktıyı, “BEGIN” ve “END” satırları da dâhil olmak üzere, kopyalayın ve GitHub -> Settings -> SSH and GPG keys yolunu izleyin. “New GPG key” butonuna tıklayın ve kopyaladığınız açık anahtarınızı bu alana yapıştırın.

GitHub üzerinde GPG key ekleme
GitHub üzerinde GPG publc key ekleme

GPG Anahtarının Git ile İlişkilendirilmesi

Anahtar çiftimizi oluşturduk. Public anahtarımızı GitHub ile paylaştık. Peki Git’in bu durumdan haberi var mı? Henüz yok. Anahtar ID’mizi Git ile ilişkilendirelim:

[root@localhost ~]# git config --global user.signingkey 160FE3845B4BD21A

Son olarak GPG anahtarımızı shell’imizin konfigürasyonuna ekleyeceğiz. Aşağıdaki komut, ev dizininizde “.bash_profile” dosyası olup olmadığını kontrol eder. Bu dosya varsa ve yazma iznine sahipsek, ayarları o dosyaya ekler:

[root@localhost ~]# test -r ~/.bash_profile1 && echo 'export GPG_TTY=$(tty)' >> ~/.bash_profile

Eğer “.bash_profile” dosyanız yoksa, aşağıdaki komut ile “.profile” dosyanıza yazabilirsiniz:

[root@localhost ~]# echo 'export GPG_TTY=$(tty)' >> ~/.profile

GPG Anahtarının E-posta Adresi ile İlişkilendirilmesi

Ortada bir anahtar var. İmzalama işi için kullanılacak. Bu anahtarın bilgilerinde adımız, e-posta adresimiz bulunmalı ki; kullanımı mümkün olabilsin.

Hatırlarsanız, biz bu bilgileri zaten key’i oluştururken vermiştik. Bu bilgileri düzenlemek, değiştirmek isterseniz aşağıdaki komutu kullanabilirsiniz:

[root@localhost ~]# gpg --edit-key 160FE3845B4BD21A
gpg> adduid

İmzalı Commit Göndermek

Commit’lerinizi imzalamak için birden fazla yöntem var. Her commit’in imzalanmasını isteyebileceğiniz gibi, commit sırasında sadece ilgili commit’in imzalanmasını da sağlayabilirsiniz:

[root@localhost ShellScripting101]# git commit -S -m "README.md güncellendi." -m "Verified commit testi."

Gizli anahtarın kilidini açmak için bir anahtar parolasına ihtiyacınız var.
Anahtarın sahibi: "Ali Sezişli (GitHub key) <example@example.com>"
4096 bitlik RSA anahtarı, 2017C963 kimliği ile 2021-01-26 tarihinde üretilmiş

[main f408623] README.md güncellendi.
 1 file changed, 4 insertions(+), 4 deletions(-)

Sonuç aşağıdaki gibi olacaktır:

GitHub verified commit
GitHub verified commit

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir