Bir Windows programını imzalamak her zaman bir Windows makinesi anlamına gelmiştir. signtool yalnızca Windows üzerinde çalışır, bu yüzden Linux üzerinde derleme yapan bir yapı hattı bile, dosyanın sonuna imza koymak için bir yerlerde yine de bir Windows sunucusuna ihtiyaç duyar.
sgcSign 2026.10 ile birlikte bu sunucu artık isteğe bağlıdır. sgcSign içindeki Authenticode biçimi, yani PE dosyasını özetleyip imzayı oluşturan kısım, Windows imzalama API'lerine yapılan bir çağrı yerine Delphi kodudur. Windows üzerinde anahtar işlemi hâlâ CNG üzerinden geçer, diğer her yerde ise sgcSign'ın kendi kriptografisinde çalışır; böylece Windows üzerinde bir EXE'yi imzalayan bileşenler Linux 64 bit üzerinde de derlenip çalışır ve Windows, bunların ürettiği dosyayı başka herhangi bir imzalı dosya gibi kabul eder. Bu yazıda bunu yapan kısa bir konsol programı, bunun Linux için nasıl derleneceği ve sonucun nasıl denetleneceği gösteriliyor.
Ubuntu üzerinde bir EXE'yi imzalayan Delphi programı, ardından aynı dosyanın Windows üzerinde denetlenmesi. YouTube'da da mevcut.
Neden Linux üzerinde imzalamalı
- Derleme aracıları. Barındırılan CI çalıştırıcıları ve derleme konteynerleri öncelikle Linux'tur. Dosyayı derleyen aracı üzerinde imzalamak, bir Windows makinesine geçişi ve bu geçişin gerektirdiği kimlik bilgilerini ortadan kaldırır.
- Anahtarın bulunduğu yer. Bir kod imzalama anahtarının bir HSM'de veya bulut anahtar kasasında bulunması gerekir; bunlara Linux'tan da aynı kolaylıkla ulaşılır. sgcSign'daki PKCS#11 ve bulut anahtar sağlayıcıları her platformda çalışır.
- Her yerde tek araç. Aynı Delphi programı, bir geliştiricinin Windows makinesinde ve yayın sunucusunda aynı seçenekler ve aynı çıktıyla imzalama yapar.
Program
İmzalanacak dosyayı, çıktı dosyasını, parolasıyla birlikte bir PFX'i ve isteğe bağlı olarak bir zaman damgası yetkilisini alan bir konsol programı. Windows ve Linux üzerinde aynı koddur.
program SignExe;
{$APPTYPE CONSOLE}
uses
SysUtils, sgcSign_Authenticode, sgcSign_KeyProvider_PFX, sgcSign_TSA;
var
PFX: TsgcPFXKeyProvider;
TSA: TsgcTSAClient;
Signer: TsgcAuthenticodeSigner;
begin
if ParamCount < 4 then
begin
Writeln('usage: SignExe <input.exe> <output.exe> <file.pfx> <password> [tsa-url]');
Halt(1);
end;
PFX := TsgcPFXKeyProvider.Create(nil);
TSA := TsgcTSAClient.Create(nil);
Signer := TsgcAuthenticodeSigner.Create(nil);
try
try
PFX.LoadFromFile(ParamStr(3), ParamStr(4));
Signer.KeyProvider := PFX;
Signer.Hash := ahSHA256;
Signer.Level := alBES;
Signer.Description := 'sgcSign demo';
if ParamCount >= 5 then
begin
TSA.URL := ParamStr(5);
Signer.TSAClient := TSA;
Signer.Level := alT;
end;
Signer.SignFile(ParamStr(1), ParamStr(2));
Writeln('Signer: ', PFX.Certificate.Subject);
Writeln('Signed: ', ParamStr(2));
except
on E: Exception do
begin
Writeln('Error: ', E.Message);
ExitCode := 1;
end;
end;
finally
Signer.Free;
TSA.Free;
PFX.Free;
end;
end.
TsgcPFXKeyProvider sertifikayı ve özel anahtarı tutar. TsgcAuthenticodeSigner, PE dosyasını Windows'un yaptığı şekilde özetler, PKCS#7 imzasını oluşturur ve bunu dosyanın sertifika tablosuna yazar. Bağlı bir TsgcTSAClient ile bir RFC 3161 zaman damgası da alır; böylece sertifika süresi dolduktan sonra bile imza geçerli kalır.
Linux 64 bit için derleme
Projects penceresinde, SDK Manager içinde bir Linux SDK'sı kurulu olacak şekilde hedef platform olarak Linux 64-bit ekleyin, ardından derleyin. sgcSign çalışma zamanı paketleri Delphi 10.3'ten itibaren Linux64 için derlenmektedir. Linux üzerinde PFX, içine aktarılacak bir Windows sertifika deposu bulunmadığından saf Pascal ile ayrıştırılır ve RSA veya ECDSA işlemi sgcSign'ın kendi kriptografisinde çalışır. Bunun etrafındaki imza biçimi, Windows üzerinde çalışan aynı kod tarafından oluşturulur.
Çalıştırma ve sonucu denetleme
$ file Hello.exe
PE32+ executable (console) x86-64, for MS Windows
$ ./SignExe Hello.exe Hello-signed-linux.exe ../certs/demo.pfx demo http://timestamp.digicert.com
Signer: O=eSeGeCe Demo, CN=sgcSign Demo Code Signing
Signed: Hello-signed-linux.exe
Windows olmadan denetlemek için, osslsigncode verify dosyanın özetini yeniden hesaplar ve üzerindeki imzayı kontrol eder: Signature verification: ok.
Ardından dosyayı Windows'a kopyalayın. PowerShell ve signtool verify /pa /v aynı imzayı okur: Windows'un hesapladığı dosya özeti, imzalanan özetle eşleşir, imzalayan taraf demo sertifikasıdır ve DigiCert zaman damgası doğrulanır. Dosya hâlâ çalışır.
PS> Get-AuthenticodeSignature .\Hello-signed-linux.exe | Format-List SignatureType,
@{n='Signer';e={$_.SignerCertificate.Subject}},
@{n='TimeStamper';e={$_.TimeStamperCertificate.Subject}}
SignatureType : Authenticode
Signer : CN=sgcSign Demo Code Signing, O=eSeGeCe Demo
TimeStamper : CN=DigiCert SHA256 RSA4096 Timestamp Responder 2026 1, O="DigiCert, Inc.", C=US
Windows'un tek şikâyet ettiği şey imza değil, demo sertifikasıdır. Demo zinciri, makinede kurulu olmayan kendinden imzalı bir test köküyle sona erer, bu yüzden Windows onu güvendiği bir köke bağlayamaz. Özet, imza ve zaman damgasının hepsi doğrulanır.
Linux ve Windows üzerinde aynı bayt dizisi
Aynı Hello.exe dosyasını aynı PFX ile ve zaman damgası olmadan, bir kez yukarıdaki programın Linux derlemesiyle, bir kez de Windows derlemesiyle imzalayın ve iki dosyayı karşılaştırın:
Linux 82344 bytes SHA-256 6FD63BB01A8E911AB099431BC76F3BFA4EF557082BFB8BC18CCBFA97A9E8079D
Windows 82344 bytes SHA-256 6FD63BB01A8E911AB099431BC76F3BFA4EF557082BFB8BC18CCBFA97A9E8079D
İkisi bayt bayt birebir aynıdır. Bu türden bir RSA imzası deterministiktir ve imzalayan, siz istemedikçe imzalama zamanını dışarıda bırakır; bu yüzden dosya yalnızca anahtara ve girdiye bağlıdır, imzalayan makineye değil. Zaman damgası, çalıştırmadan çalıştırmaya farklılık gösteren tek parçadır, çünkü zaman damgası yetkilisi kendisine sorulduğu anı damgalar.
Anahtar nereden gelir
Linux üzerinde anahtar bir PFX veya PEM dosyasından, bir PKCS#11 belirtecinden veya HSM'den ya da bir bulut imzalama hizmetinden gelebilir: Azure Trusted Signing, AWS KMS, Google Cloud KMS, HashiCorp Vault veya bir CSC uzak imzalama hizmeti. Windows sertifika deposu sağlayıcısı, açık bir nedenle yalnızca Windows'ta kalan tek sağlayıcıdır.
Sadece EXE değil
Aynı durum sgcSign'daki her kod imzalama bileşeni için geçerlidir: EXE ve DLL için TsgcAuthenticodeSigner, .cat katalogları için TsgcCatalogSigner, Windows Installer .msi ve .msp dosyaları için TsgcMSISigner, .msix ve .appx paketleri için TsgcAppxSigner, PowerShell betikleri için TsgcPowerShellSigner ve bunların herhangi birini denetlemek için TsgcAuthenticodeVerifier. Bunların hepsi Linux, macOS, iOS ve Android üzerinde derlenip çalışır.
Sunucuda ve komut satırında
Aynısı kütüphanenin ötesinde de geçerlidir. Linux için derlenen bir sgcSign Server, Authenticode, PowerShell, katalog, MSI ve MSIX isteklerini tıpkı Windows'ta olduğu gibi imzalar ve doğrular, ve sgcsign komut satırı aracı bunları herhangi bir platformdan gönderir. Delphi komut satırı aracında bir yol hâlâ yalnızca Windows'a özgüdür: bir EXE veya DLL'i yerel olarak özetleyip yalnızca özeti göndermek. .NET komut satırı aracı bu yolu her platformda kullanır.
Kullanılabilirlik
Linux, macOS, iOS ve Android üzerinde kod imzalama, Delphi için sgcSign 2026.10 ile sunulur. Bir Windows programı için hiçbir şey değişmez: aynı bileşenler, aynı özellikler ve aynı çıktı. Her özellik sgcSign çevrimiçi yardımında belgelenmiştir.
Sorularınız mı var, ya da Windows'tan uzaklaştırmak istediğiniz bir hattınız mı var? Bizimle iletişime geçin, kodu yazan kişilerden yanıt alacaksınız.
