Kod imzalarken karşılaşılan en yaygın hatalardan biri şudur:
SignTool Error: No certificates were found that met all the given criteria.
Hata, SignTool'un verdiğiniz ölçütlere uyan kullanılabilir bir sertifika bulamadığını söyler. Sertifikanız bilgisayarda olsa bile bu hatayı alabilirsiniz; çünkü SignTool yalnızca özel anahtarı erişilebilir, süresi geçerli ve kod imzalamaya uygun sertifikaları dikkate alır. Aşağıda hatanın nedenlerini sık görülme sırasına göre ve her birinin çözümüyle birlikte bulacaksınız.
1. Adım: SignTool'a neden reddettiğini sorun
Tahmin yürütmeden önce aynı komutu /debug parametresiyle çalıştırın. SignTool her sertifikayı listeler ve hangisini neden elediğini yazar:
signtool sign /debug /fd sha256 /a dosyaniz.exe
Çıktıda "After ... filter, 0 certs were left" gibi satırlar görürsünüz. Sertifikaların hangi filtrede elendiği, aşağıdaki nedenlerden hangisinin sizi etkilediğini gösterir.
Ardından sertifikalarınızı listeleyin:
# PowerShell: kod imzalamaya uygun sertifikalar (geçerli kullanıcı)
Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Format-List Subject, Thumbprint, NotAfter, HasPrivateKey
# Komut istemi: kişisel sertifika deposu
certutil -user -store My
Neden 1: Sertifika bilgisayar deposunda, SignTool kullanıcı deposuna bakıyor
SignTool varsayılan olarak geçerli kullanıcının "Kişisel" (My) deposunda arar. Sertifikanız Yerel Bilgisayar deposuna yüklendiyse bulunamaz.
Çözüm: Komuta /sm ekleyin:
signtool sign /sm /fd sha256 /sha1 PARMAK_IZI dosyaniz.exe
Neden 2: Özel anahtar yok (sadece .cer dosyası yüklenmiş)
İmzalamak için sertifikanın özel anahtarına erişim gerekir. Yalnızca .cer/.crt dosyasını içe aktardıysanız sertifika listede görünür ama imzalamada kullanılamaz. PowerShell çıktısında HasPrivateKey : False yazıyorsa sorun budur.
Çözüm: Anahtar bir USB token'da veya bulut HSM'de ise ilgili istemcinin (aşağıya bakın) çalıştığından emin olun. Dosya tabanlı eski bir sertifikanız varsa .pfx dosyasını /f ve /p ile kullanın. Not: Haziran 2023'ten sonra verilen kod imzalama sertifikalarında özel anahtar dışa aktarılamaz; anahtar her zaman token veya HSM'de kalır.
Neden 3: Token veya bulut imzalama istemcisi bağlı değil
Güncel sertifikalarda anahtar bir USB token'da veya bulutta durur. İstemci kapalıysa sertifika Windows deposunda görünmez ya da özel anahtarına ulaşılamaz.
- Certum SimplySign: SimplySign Desktop uygulamasını açın ve telefondaki SimplySign uygulamasından aldığınız kodla oturum açın. Oturum açıkken sanal kart takılı görünür ve sertifika depoya gelir. Kurulum ayrıntıları: SimplySign Desktop rehberi.
- USB token (SafeNet vb.): Token'ın takılı olduğunu ve üreticinin istemci yazılımının (ör. SafeNet Authentication Client) kurulu olduğunu kontrol edin.
- Bulut HSM / Key Vault tabanlı çözümler: Bu servisler genellikle kendi imzalama aracını veya SignTool için özel bir eklentiyi (dlib) kullanır; sertifika Windows deposunda hiç görünmeyebilir. Sağlayıcınızın belgelediği komutu kullanın.
Neden 4: /n veya /sha1 değeri sertifikayla eşleşmiyor
/n "Şirket Adı"sertifikanın konu (Subject) adındaki CN ile eşleşmelidir. Türkçe karakterler, "A.Ş." gibi kısaltmalar ve boşluklar sık hata kaynağıdır./sha1ile verdiğiniz parmak izi (thumbprint) boşluksuz ve eksiksiz olmalıdır. Sertifika yönetiminden kopyalarken başa görünmez bir karakter eklenebilir; değeri elle yeniden yazın.
En güvenilir yöntem parmak izini kullanmaktır; birden fazla sertifikanız olduğunda da SignTool'un yanlış sertifikayı seçmesini önler.
Neden 5: Sertifikanın süresi dolmuş veya kod imzalamaya uygun değil
SignTool süresi geçmiş sertifikaları ve "Kod İmzalama" (Code Signing) amaçlı olmayan sertifikaları (ör. SSL sertifikası, e-imza sertifikası) eler. Nitelikli elektronik imza (e-imza) sertifikaları da bu nedenle yazılım imzalamak için kullanılamaz.
Çözüm: Sertifika ayrıntılarında "Amaçlar" bölümünde Kod İmzalama yazdığını ve geçerlilik tarihini kontrol edin. Süresi dolduysa yeni bir kod imzalama sertifikası almanız gerekir.
Neden 6: Farklı kullanıcı veya CI/CD hizmet hesabı
Komut Visual Studio'da, Jenkins'te, GitHub Actions runner'ında veya bir Windows hizmetinde çalışıyorsa, sertifikayı yüklediğiniz kullanıcıdan farklı bir hesapla çalışıyor olabilir. O hesabın kullanıcı deposunda sertifika yoktur.
Çözüm: Sertifikayı hizmet hesabının deposuna yükleyin, yerel bilgisayar deposunu /sm ile kullanın ya da bulut imzalama sağlayıcınızın CI/CD entegrasyonunu tercih edin.
Neden 7: Yanlış SignTool sürümü veya /fd eksik
Çok eski SignTool sürümleri güncel sertifikalar ve SHA-256 ile sorun çıkarabilir. Windows SDK'nın güncel sürümündeki SignTool'u kullanın ve komuta her zaman /fd sha256 ekleyin.
Doğru çalışan örnek komut
signtool sign /sha1 PARMAK_IZI /fd sha256 /tr http://time.certum.pl /td sha256 /d "Uygulama Adı" dosyaniz.exe
signtool verify /pa /v dosyaniz.exe
/tr ve /td RFC 3161 zaman damgası ekler; sertifikanızın süresi dolsa bile imza geçerli kalır. Farklı bir CA kullanıyorsanız o CA'nın zaman damgası adresini yazın. Tüm adımlar için: SignTool ile EXE imzalama rehberi.
Hızlı kontrol listesi
| Kontrol | Nasıl? |
|---|---|
| Sertifika depoda mı? | certutil -user -store My (bilgisayar deposu için -user olmadan) |
| Özel anahtar var mı? | PowerShell'de HasPrivateKey : True |
| Token / SimplySign bağlı mı? | İstemci açık ve oturum açılmış olmalı |
| Amaç "Kod İmzalama" mı? | Sertifika ayrıntıları → Amaçlar |
| Süresi geçerli mi? | NotAfter tarihi |
| Doğru hesap mı? | CI/CD'de hizmet hesabını kontrol edin |
| Neden elendi? | signtool sign /debug ... |
Sıkça Sorulan Sorular
Sertifika "certmgr.msc"de görünüyor ama yine de hata alıyorum, neden?
En sık iki neden vardır: özel anahtar erişilebilir değildir (token veya SimplySign oturumu kapalı) ya da SignTool farklı bir depoya bakmaktadır. /debug çıktısı hangisi olduğunu gösterir.
/a parametresi ne işe yarar?
/a, SignTool'un uygun sertifikalar arasından en iyisini otomatik seçmesini sağlar. Tek sertifikanız varsa pratiktir; birden fazla sertifikanız varsa yanlış seçimi önlemek için /sha1 kullanın.
E-imza (nitelikli elektronik sertifika) ile program imzalayabilir miyim?
Hayır. E-imza sertifikaları belge imzalamak içindir ve "Kod İmzalama" amacını taşımaz. Windows programları için Microsoft'un güvendiği bir CA'dan alınmış kod imzalama sertifikası gerekir.



