Git “Permission denied (publickey)” hatası, uzak Git sunucusunun bağlantı sırasında sunulan SSH anahtarını kabul etmediğini gösterir. Sorun eksik bir anahtardan, anahtarın yanlış GitHub hesabına eklenmesinden, yerel bilgisayarda doğru anahtarın sunulmamasından veya uzak depo adresinin beklenenden farklı olmasından kaynaklanabilir. Çözüm için önce uzak adresin gerçekten SSH kullanıp kullanmadığını kontrol etmek, ardından doğru anahtarın doğru hesapla eşleştiğini doğrulamak gerekir.
SSH anahtar çiftini bir kapının kilidi ve anahtarı gibi düşünebilirsin. Açık anahtar, GitHub hesabına eklenebilen ve paylaşılmasında sakınca bulunmayan kilit bilgisine benzer. Özel anahtar ise yalnızca senin bilgisayarında kalması gereken anahtardır. Özel anahtarı kimseyle paylaşmamalı, bir forma, mesaja, ekran görüntüsüne veya GitHub üzerindeki herhangi bir alana yapıştırmamalısın. GitHub, açık anahtarı hesabınla eşleştirerek SSH bağlantısındaki kimliğini doğrular; bu doğrulama, ilgili depoya yazma yetkisinin bulunduğu anlamına tek başına gelmez. Hesap tanınsa bile depo erişimin olmayabilir.
Permission denied (publickey) hatası ne anlama gelir?
Bu hata, SSH sunucusunun bilgisayarından gelen kimlik doğrulama isteğinde geçerli bir anahtar bulamadığı veya sunulan anahtarı ilgili hesapla eşleştiremediği anlamına gelir. Örneğin yeni bir bilgisayarda henüz SSH anahtarı oluşturmamış olabilirsin, anahtarı GitHub hesabına eklememiş olabilirsin ya da bilgisayarda birden fazla anahtar bulunmasına rağmen Git yanlış olanı sunuyor olabilir.
Hatanın metnindeki publickey bölümü, bağlantının parola yerine açık ve özel anahtar çiftiyle doğrulanmaya çalışıldığını anlatır. Bu nedenle rastgele bir özel anahtarı GitHub’a yüklemek veya özel anahtarın içeriğini terminalde paylaşmak güvenli bir çözüm değildir. GitHub’a yalnızca .pub uzantılı açık anahtar eklenir; özel anahtar dosyası yerel bilgisayarda korunur.
Bir başka önemli ayrım da kimlik doğrulama ile depo yetkisidir. SSH anahtarın kabul edilirse GitHub hangi hesapla bağlandığını anlayabilir. Ancak bu hesap, uzak depoya push yapma iznine sahip değilse farklı bir yetki hatasıyla karşılaşabilirsin. Bu yüzden sorunu incelerken önce “hangi hesapla bağlanıyorum?” ve ardından “bu hesabın ilgili depoya yazma yetkisi var mı?” sorularını ayrı değerlendirmek gerekir.
Önce uzak depo adresini kontrol et

İlk kontrol, yerel deponun hangi uzak adresi kullandığını görmektir. Proje klasöründe aşağıdaki komutu çalıştır:
git remote -v
Uzak depo SSH kullanıyorsa çıktı genellikle şu biçimdedir:
origin [email protected]:OWNER/REPOSITORY.git (fetch)
origin [email protected]:OWNER/REPOSITORY.git (push)
Buradaki origin, uzak deponun yerel adıdır. Bazı projelerde bu ad upstream veya başka bir isim olabilir. Önemli olan, komut çıktısındaki uzak adın ve depo yolunun doğru olmasıdır.
Uzak adres HTTPS biçimindeyse çıktı şöyle görünür:
origin https://github.com/OWNER/REPOSITORY.git (fetch)
origin https://github.com/OWNER/REPOSITORY.git (push)
HTTPS adresi kullanıldığında bu bağlantının kimlik doğrulamasında SSH anahtarı devreye girmez. SSH anahtarıyla bağlanmak istiyorsan uzak adresi SSH biçimine çevirebilirsin. Uzak adın gerçekten origin olduğundan emin olduktan sonra komut şu şekildedir:
git remote set-url origin [email protected]:OWNER/REPOSITORY.git
git remote -v
Bu komutta OWNER/REPOSITORY bölümünü, erişim yetkin bulunan gerçek GitHub kullanıcı adı veya kuruluş adı ile depo adıyla değiştirmelisin. Yanlış depoyu gösteren bir adres, SSH anahtarın doğru çalışsa bile push işleminin başarısız olmasına yol açabilir. Adresi değiştirdikten sonra git remote -v çıktısında hem fetch hem de push satırının beklediğin SSH adresini gösterdiğini kontrol et. Git, uzak adresleri git remote -v ile görüntülemeyi ve git remote set-url ile değiştirmeyi destekler.
Mevcut SSH anahtarlarını kontrol et ve gerekirse oluştur
Yeni bilgisayarında ilk git push denemesinde bu hatayı alırsan, önce kullanabileceğin bir SSH anahtar çiftinin bulunup bulunmadığını kontrol et. macOS veya Linux terminalinde ya da Windows'ta Git Bash içinde şu komutu çalıştır:
ls -al ~/.ssh
Windows PowerShell kullanıyorsan aynı klasörü şu komutla listeleyebilirsin:
Get-ChildItem -Force "$HOME.ssh"
Listede örneğin id_ed25519 ve id_ed25519.pub görünebilir. Klasörün bulunamadığını belirten bir hata alırsan varsayılan konumda henüz bir anahtar çifti bulunmuyor olabilir. Farklı adla veya konumda oluşturulmuş anahtarların da olabileceğini unutma.
Bu çifti bir kilit ve anahtar gibi düşünebilirsin: Açık anahtar, kimliğini doğrulaması için GitHub'a verdiğin kilit gibidir; özel anahtar ise sende kalır. Özel anahtarı kimseyle paylaşma ve hiçbir yere yapıştırma. .pub uzantılı dosya açık anahtardır; aynı adlı, uzantısız dosya ise özel anahtardır.
Kullanmak istediğin uygun bir çift yoksa aşağıdaki komutla Ed25519 türünde bir çift oluşturabilirsin. E-posta adresini kendi adresinle değiştir; bu bilgi anahtarı tanımana yardımcı olan bir etikettir.
ssh-keygen -t ed25519 -C "[email protected]"
Komut önce anahtar çiftinin oluşturulduğunu bildirir, ardından dosyanın kaydedileceği yolu sorar. Önerilen konumu kabul etmek için Enter'a basabilirsin. Dosyanın üzerine yazılıp yazılmayacağı sorulursa mevcut anahtarı korumak için işlemi onaylama; bunun yerine farklı bir dosya adıyla yeniden dene.
Sonraki istemlerde özel anahtarı koruyan bir parola belirleyip aynı parolayı tekrar gir. İşlem tamamlandığında özel ve açık anahtarın kaydedildiğini belirten mesajlar görünür. Farklı bir dosya adı seçtiysen sonraki komutlarda da o adı kullan.
SSH anahtarını agent ile kullan

SSH agent, özel anahtarı kullanarak kimlik doğrulama işlemlerine yardımcı olur ve parolalı anahtarı tekrar kullanmayı kolaylaştırır. Agent her kurulumda zorunlu değildir; SSH istemcisi yapılandırmaya göre özel anahtarı dosyadan da kullanabilir.
macOS veya Linux'ta, kullandığın terminal oturumunda agent'ı başlat:
eval "$(ssh-agent -s)"
Başarılı olduğunda Agent pid ile başlayan bir mesaj görürsün. Ardından özel anahtar dosyasını ekle:
ssh-add ~/.ssh/id_ed25519
Parola belirlediysen parola istenebilir; başarılı eklemede Identity added mesajı görünür. Dosya adını değiştirdiysen komuttaki yolu kendi özel anahtar dosyanın yoluyla değiştir.
Windows'ta yerleşik OpenSSH agent hizmetini kullanacaksan yönetici olarak açtığın PowerShell penceresinde şu komutları çalıştır:
Get-Service -Name ssh-agent | Set-Service -StartupType Manual
Start-Service ssh-agent
Komutlar başarılı olduğunda genellikle çıktı vermez. Ardından normal yetkili bir PowerShell penceresi açıp anahtarı ekle:
ssh-add "$HOME.sshid_ed25519"
Gerekirse parolanı girdikten sonra Identity added mesajını görürsün. Windows'ta Git, farklı bir SSH istemcisi kullanıyorsa bu agent'a erişemeyebilir; böyle bir durumda Git'in kullandığı SSH istemcisini kontrol et.
Açık anahtarı GitHub hesabına ekle
GitHub hesabına eklemen gereken dosya, .pub uzantılı açık anahtar dosyasıdır. Açık anahtarı, yalnızca doğru GitHub hesabına ait kilit gibi düşünebilirsin. Özel anahtar ise bu kilidi açan kişisel anahtar gibidir. Özel anahtar dosyasının içeriğini hiçbir yere yapıştırma, kimseyle paylaşma ve GitHub’daki Key alanına yükleme.
Örnekteki dosya adın farklıysa id_ed25519.pub yerine kendi açık anahtar dosyanın adını kullan. Kopyalama sırasında anahtarın tamamını ve satır sonundaki e-posta etiketini al, başına veya sonuna fazladan boşluk ekleme.
macOS
pbcopy < ~/.ssh/id_ed25519.pub
Komut başarılı olduğunda terminalde özel bir çıktı görünmeyebilir. Açık anahtar panoya kopyalanır.
Windows
clip < ~/.ssh/id_ed25519.pub
Git Bash kullanıyorsan bu komut anahtarı panoya kopyalar. Windows Terminal veya PowerShell içinde yönlendirme işaretiyle ilgili hata alırsan şu biçimi kullanabilirsin:
cat ~/.ssh/id_ed25519.pub | clip
Bu komutların beklenen sonucu, anahtarın terminale yazdırılması değil, panoya alınmasıdır.
Linux
cat ~/.ssh/id_ed25519.pub
Terminalde tek satırlık açık anahtar görünür. Satır genellikle ssh-ed25519 ile başlar ve anahtarı oluştururken kullanılan etiketle biter. Satırın tamamını seçip kopyala. .pub uzantısı olmayan dosyayı açıp kopyalama.
GitHub’da profil fotoğrafına tıkla, Settings bölümünü aç ve sol menüdeki Access başlığı altında SSH and GPG keys seçeneğine gir. New SSH key veya Add SSH key düğmesine bas, başlık alanına bilgisayarı tanımlayan bir ad yaz, anahtar türünde Authentication seçeneğini belirle ve kopyaladığın açık anahtarın tamamını Key alanına yapıştır. Ardından Add SSH key düğmesine basarak işlemi tamamla.
Yeni anahtar oluşturuyorsan GitHub belgelerindeki standart komut Ed25519 türünü kullanır. Ed25519 desteklemeyen eski bir sistemde RSA 4096 tercih edilebilir.
SSH bağlantısını test et ve hatayı sürdürüyorsa incele
Anahtarı GitHub hesabına ekledikten ve ssh-agent içine yükledikten sonra bağlantıyı şu komutla dene:
ssh -T [email protected]
Başarılı kimlik doğrulamada buna benzer bir mesaj görürsün:
Hi USERNAME! You've successfully authenticated, but GitHub does not provide shell access.
Buradaki “shell access” ifadesi, GitHub’ın sana uzak sunucuda komut çalıştırma kabuğu vermediğini anlatır. SSH kimlik doğrulaması başarılı olduğu için bu mesaj tek başına hata anlamına gelmez.
İlk bağlantıda sunucunun kimliği sorulursa ekrandaki ED25519 parmak izini GitHub’ın SSH anahtarı parmak izleri sayfasındaki değerle karşılaştır. Örneğin GitHub belgelerinde yayımlanan ED25519 parmak izi SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU biçimindedir. Eşleşmiyorsa doğrulamayı onaylama.
Test hâlâ Permission denied (publickey) ile sonuçlanıyorsa şu sırayla ilerle:
- Komutun ve remote adresinin
[email protected]kullanıp kullanmadığını kontrol et. GitHub kullanıcı adını SSH kullanıcısı olarak yazma. ssh-add -l -E sha256komutuyla anahtarın agent tarafından yüklendiğini kontrol et. Çıktı yoksa özel anahtar agent’a eklenmemiş olabilir.- GitHub hesabındaki SSH anahtar listesini açıp agent çıktısındaki anahtarın karşılığının doğru hesapta bulunduğunu karşılaştır.
git remote -vkomutuyla doğru sahip ve depo adına bağlandığını kontrol et. Hesabın bu depoya yazma yetkisine sahip olmalıdır.- Remote adresi ve yetki doğruysa, geçerli dal adını kontrol edip
git push -u origin dal-adıkomutunu çalıştır.
SSH testi başarılı olduğu hâlde push reddedilirse anahtar doğrulaması çalışıyor demektir. Bu durumda sorun çoğunlukla yanlış depo adresi, depoya yazma yetkisinin bulunmaması veya dal kurallarıyla ilgilidir.
Sık Sorulan Sorular
SSH bağlantı testi başarılıyken git push neden başarısız olabilir?
SSH bağlantı testi, anahtarın hangi GitHub hesabıyla doğrulandığını gösterir; belirli bir depoya yazma yetkisini doğrulamaz. Remote adresi yanlışsa, doğrulanan hesap depoya erişemiyorsa veya hedef dalın yazma kuralları push işlemine izin vermiyorsa bağlantı testi başarılı olsa bile git push reddedilebilir.
Birden fazla GitHub hesabı için farklı SSH anahtarları kullanılabilir mi?
Birden fazla GitHub hesabı için farklı SSH anahtarları kullanılabilir. Her hesap için ayrı anahtar oluşturup ilgili açık anahtarı doğru hesaba ekleyebilir, ardından ~/.ssh/config içindeki farklı bağlantı adlarıyla hangi anahtarın kullanılacağını belirleyebilirsin. Remote adresinin de bu bağlantı adına göre düzenlenmesi gerekir.
Permission denied (publickey) hatasını çözerken anahtarın kendisinden önce doğru hesap, doğru remote adresi ve doğru depo yetkisini birlikte kontrol etmek gerekir.