Delphi'de OpenSSL mi Yerel Kripto mu: Çalışma Zamanında Seçin

· Bileşenler
Delphi'de OpenSSL mi Yerel Kripto mu: Çalışma Zamanında Seçin

Bir Delphi uygulamasından OpenSSL DLL'lerini kaldırmak eskiden bir build kararıydı. Bir derleyici define'ı açar, yeniden derler ve makinelerinde OpenSSL bulunamayan müşterilere ikinci bir çalıştırılabilir dosya gönderirdiniz. sgcWebSockets 2026.10 bunu bir çalışma zamanı kararına dönüştürüyor: başlangıçta bir kez ayarlanan tek bir global değişken, uygulama kriptografisinin OpenSSL üzerinde mi yoksa kütüphaneye gömülü, Object Pascal ile yazılmış kriptografi üzerinde mi çalışacağını belirler.

Bağlantı tarafı, yani OpenSSL olmadan TLS, OpenSSL DLL'leri Olmadan Delphi TLS 1.3 yazısında ele alınıyor. Bu yazı geri kalan her şeyle ilgili: uygulamanızın TLS handshake'i dışında yaptığı imzalar, hash'ler, anahtar anlaşması ve şifreleme.

Başlangıçta Tek Satır

sgcBase_Helpers birimi, TsgcCryptoBackend türünden global sgcCryptoBackend değişkenini bildirir:

uses
  sgcBase_Helpers;

begin
  sgcCryptoBackend := cbNative;
  sgcCheckNativeCrypto;
  Application.Initialize;
  ...

Anahtar bileşen başına değil globaldir, bu yüzden herhangi bir bileşen oluşturulmadan önce ayarlayın. sgcCheckNativeCrypto isteğe bağlıdır: yerel kripto birimleri derlemeye dahil değilse, uygulamanızın yapmaya çalıştığı ilk imzada değil, başlangıçta net bir mesajla hata verir.

Üç Değer

cbAuto, her iki şekilde de dağıtılan ürünler içindir. Bazı müşteriler OpenSSL kütüphanelerini çalıştırılabilir dosyanın yanına kurar, bazılarına buna izin verilmez, ve aynı build, eksik bir DLL hakkında destek talebi açılmadan her ikisi için de çalışır.

// same executable, with or without the OpenSSL libraries beside it
sgcCryptoBackend := cbAuto;

Anahtarın Etkilediği Alanlar

Anahtar, bileşenlerin sizin adınıza yaptığı kriptografiyi kapsar:

Bunların hiçbiri kod değişikliği gerektirmez. Dün OpenSSL ile imzalanan bir JWT, değişken öyle söylediği için bugün yerel olarak imzalanır.

Bağlantılar Ayrı Bir Ayardır

sgcCryptoBackend, bir bileşenin nasıl bağlandığını değiştirmez. Bir bağlantının TLS'i bileşen başına seçilir: TCP, HTTP ve WebSocket bileşenlerinde ve MQTT gibi bunların üzerine kurulu her şeyde IOHandler = iohNativeTLS ile, QUIC ve HTTP/3'te, ve WebRTC için DTLSOptions ile:

sgcCryptoBackend := cbNative;                  // application crypto
oClient.TLSOptions.IOHandler := iohNativeTLS;  // this connection

OpenSSL handler'ını koruyan bir bileşen, bağlandığında yine de OpenSSL yükler. QUIC, HTTP/3 ve DTLS'te iohNativeTLS ile, anahtar ne derse desin OpenSSL hiç kullanılmaz. Hiçbir yerde OpenSSL istemeyen bir uygulama ikisini birden ayarlar: kriptografisi için anahtarı, ve güvenli bağlantı açan her bileşende handler'ı.

Define Artık İsteğe Bağlı

Şimdiye kadar OpenSSL olmadan çalışmak, SGC_NATIVE_CRYPTO derleyici define'ı anlamına geliyordu. Artık buna gerek yok. Bu define olmadan hem OpenSSL hem de yerel kod derlemeye dahil edilir ve karar çalışma zamanında değişken tarafından verilir.

Define'ın hâlâ bir kullanımı var. sgcCryptoBackend ne derse desin yerel arka ucu zorlar ve OpenSSL kodunu uygulama kripto birimlerinden çıkarır, böylece çalıştırılabilir dosya küçülür. Bir build'in OpenSSL'i asla kullanmayacağını biliyorsanız, hâlâ doğru seçim budur. Henüz bilmiyorsanız, kapalı bırakın ve başlangıçta karar verin.

Neden Önemli

Yükseltme

cbOpenSSL varsayılan olduğu için, siz değişkeni ayarlayana kadar hiçbir şey değişmez. Yerel arka ucu denemek için yukarıdaki iki satırı proje dosyanıza ekleyin, testlerinizi çalıştırın ve karşılaştırın. Anahtarın kapsadığı her şeyin tam listesi, ve çalışma zamanında sıfır OpenSSL için her alanın hangi ayara ihtiyaç duyduğu, OpenSSL Olmadan Çalıştırma yardım konusunda yer alıyor.

Sırada Ne Var

Sorularınız, geri bildiriminiz veya taşıma konusunda yardıma mı ihtiyacınız var? İletişime geçin. Kodu yazan kişilerden yanıt alacaksınız.