Delphi ile Linux'tan Windows EXE İmzalama

· Bileşenler
Delphi ile Linux'tan Windows EXE İmzalama

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ı

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.