encyklopedia.space

Code signing (podpisywanie kodu)

Code signing – w języku polskim podpisywanie kodu – jest techniką kryptograficzną pozwalającą zweryfikować integralność oraz autentyczność oprogramowania (np. aplikacji, sterowników, skryptów, paczek npm) przy użyciu certyfikatu cyfrowego oraz klucza prywatnego. Dzięki podpisowi cyfrowemu użytkownik końcowy może upewnić się, że dany plik nie został zmodyfikowany po jego wydaniu przez twórcę oraz że pochodzi on od zaufanego podmiotu.

Historia i rozwój

Idea podpisywania kodu sięga początków lat 1990, kiedy to producenci systemów operacyjnych zaczęli wprowadzać mechanizmy weryfikacji integralności sterowników. W 1997 r. firma Microsoft wprowadziła technologię Microsoft Authenticode, a w 2000 r. Apple udostępniła własny system Apple Code Signing. Od tego czasu standardy kod‑signingu stały się integralną częścią platform mobilnych (Android, iOS) oraz środowisk chmurowych.

Podstawowy proces

  1. Twórca generuje parę kluczy: klucz prywatny i klucz publiczny.
  2. Klucz publiczny jest dołączany do certyfikatu cyfrowego wydanego przez urząd certyfikacji (CA).
  3. Podpisywanie odbywa się przy użyciu algorytmu skrótu (np. SHA‑256) oraz algorytmu asymetrycznego (np. RSA, ECDSA).
  4. W wyniku procesu powstaje plik podpisany (np. .exe, .dll, .apk, .ipa), który zawiera zarówno oryginalny kod, jak i jego cyfrowy podpis.
  5. Podczas uruchamiania lub instalacji system operacyjny (Windows, macOS, Linux) weryfikuje podpis, sprawdzając łańcuch zaufania aż do zaufanego CA.

Zastosowania

  • Dystrybucja oprogramowania komercyjnego i open‑source (npm, Maven).
  • Podpisywanie sterowników i komponentów systemowych (sterowniki).
  • Weryfikacja skryptów instalacyjnych (PowerShell, Bash).
  • Bezpieczne dostarczanie aktualizacji (OTA – over‑the‑air).
  • Podpisywanie aplikacji mobilnych i webowych (APK, IPA, WebAssembly).

Standardy i protokoły

Najważniejsze standardy wykorzystywane w code signing to:

  • PKCS#7 (Cryptographic Message Syntax) – format kontenera podpisu.
  • PKCS#12 – format przechowywania kluczy i certyfikatów w pliku .pfx lub .p12.
  • X.509 – struktura certyfikatu cyfrowego.
  • RFC 3161 – usługi znacznika czasu (timestamping) umożliwiające utrzymanie ważności podpisu po wygaśnięciu certyfikatu.

Bezpieczeństwo i ograniczenia

Podpis cyfrowy zapewnia jedynie integralność i autentyczność kodu, ale nie chroni przed:

  • Wstrzyknięciem złośliwego kodu przed podpisaniem (atak na łańcuch dostaw).
  • Kradzieżą klucza prywatnego – w takim wypadku atakujący może tworzyć fałszywe podpisy.
  • Ustawieniami polityki zaufania systemu – np. w Windows domyślnie akceptowane są tylko certyfikaty od zaufanych CA.

Dlatego w praktyce code signing jest wykorzystywany w połączeniu z dodatkowymi mechanizmami, takimi jak Secure Boot, politiki integralności kodu czy weryfikacja aktualizacji.

Narzędzia i biblioteki

Do podpisywania kodu dostępnych jest wiele narzędzi, zarówno komercyjnych, jak i open‑source:

  • signtool.exe (Microsoft Authenticode) – standard w środowisku Windows.
  • codesign – narzędzie w macOS.
  • OpenSSL – umożliwia tworzenie i weryfikację podpisów w formacie PKCS#7.
  • jarsigner – do podpisywania plików JAR w ekosystemie Java.
  • npm – w połączeniu z npm sign i GPG weryfikuje pakiety.

Prawo i regulacje

W wielu jurysdykcjach podpisy cyfrowe mają moc prawną równą podpisom odręcznym, pod warunkiem spełnienia wymogów określonych w:

  • eIDAS (UE) – rozporządzenie o identyfikacji elektronicznej i usługach zaufania.
  • UETA (USA) – Uniform Electronic Transactions Act.
  • lokalnych ustawach o podpisach cyfrowych.

W praktyce oznacza to, że oprogramowanie opublikowane jako „podpisane” może być traktowane jako dowód, że autor nie wprowadził zmian po wydaniu, co ma szczególne znaczenie w przemyśle lotniczym, medycznym i motoryzacyjnym.

Zobacz także