Native TLS

Destekleyen

 

TsgcWebSocketClient

TsgcTCPClient

TsgcHTTP1Client

TsgcHTTP2Client

TsgcWebSocketServer

TsgcWebSocketHTTPServer

TsgcHTTPServer

TsgcWebSocketProxyServer

TsgcWebSocketLoadBalancerServer

 

*Standard sürümden itibaren gelen sgcCrypto paketini gerektirir.

 

Yerel TLS motoru, sgcCrypto birimlerinin üzerine tamamen Object Pascal ile yazılmış bir TLS 1.3 ve TLS 1.2 uygulamasıdır. Bir bağlama (binding) değildir: dağıtılacak hiçbir OpenSSL DLL'i, hiçbir SChannel çağrısı ve işin içinde hiçbir platform TLS kitaplığı yoktur. Aynı kaynak kod Delphi 7'den RAD Studio 13'e kadar derlenir ve bileşenlerin desteklediği her platformda çalışır.

 

Ona yönelmenin nedeni anahtar değişimidir. Motor, RFC 10024'ün hibrit kuantum sonrası gruplarını sunar ve X25519MLKEM768 önerdiği ilk gruptur, böylece ona geçen bir istemci, uygulamada başka hiçbir değişiklik olmadan, bunu destekleyen herhangi bir sunucuya karşı kuantum sonrası bir anahtar değişimi müzakere eder. Hibrit gruplar yalnızca TLS 1.3'te bulunur, bu yüzden TLS 1.2'ye geri dönen bir bağlantı klasik bir eğri kullanır. Bu grupların ne olduğu ve bugün neden bir hibritin makul geçiş yolu olduğu için bkz. Kuantum Sonrası Kriptografi.

 

Etkinleştirme

 

IOHandler'ı ayarlayın, başka hiçbir şey değişmez. Zaten kullandığınız sertifika, anahtar, kök sertifika, doğrulama ve ALPN özellikleri çalışmaya devam eder, motor da aynılarını okur.

 


// client
oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLS := True;
oClient.TLSOptions.IOHandler := iohNativeTLS;
oClient.TLSOptions.VerifyCertificate := True;
oClient.TLSOptions.RootCertFile := 'cacert.pem';
oClient.Active := True;

// server
oServer := TsgcWebSocketServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohNativeTLS;
oServer.SSLOptions.CertFile := 'certificate.pem';
oServer.SSLOptions.KeyFile := 'key.pem';
oServer.Active := True;

 

Bir sunucuda motor, olay güdümlü motorlar üzerinde de çalışır. Windows'ta IOHandlerOptions.IOHandlerType değerini iohIOCP olarak veya Linux'ta iohEPOLL olarak ayarlayın, işleyici eşleşen TLS Sağlayıcısı üzerine kurulur, böylece aynı yapılandırma her üç motorda da çalışır.

 

sgcCrypto paketi olmayan bir yapıda iohNativeTLS seçmek, sessizce başka bir kitaplığa düşmek yerine bunu söyleyen bir hata verir.

 

TLS sürümleri

 

Motor, Indy istemcisinde, Indy sunucusunda ve IOCP ile EPOLL sunucu motorlarında, hem istemci hem sunucu olarak TLS 1.3 ve TLS 1.2 konuşur. Her iki taraf da destekliyorsa TLS 1.3 her zaman seçilir. Yerel motor için, bir istemcide TLSOptions.Version ve bir sunucuda SSLOptions.Version, izin verilen en düşük sürümdür.

 

Sürüm Müzakere edilen
tlsUndefined (varsayılan) TLS 1.3 veya TLS 1.2
tls1_2 TLS 1.3 veya TLS 1.2
tls1_3 Yalnızca TLS 1.3
tls1_0, tls1_1 Hiçbir şey. Motor yalnızca TLS 1.2 ve TLS 1.3'ü desteklediği için bir istemci bağlanırken, bir sunucu da başlarken bir yapılandırma hatası verir.

 

Bu, OpenSSL işleyicisinin özelliği okuma biçiminden farklıdır. iohOpenSSL ile tls1_2 tam olarak TLS 1.2 anlamına gelir, iohNativeTLS ile ise TLS 1.2 veya sonrası anlamına gelir. Geri kalanına şifre paketi listesi karar verir. Yalnızca TLS 1.2 elde etmek için Version değerini tls1_2'de bırakın ve NativeTLS_Options.CipherSuites içinde yalnızca TLS 1.2 paketlerini belirtin. Yalnızca TLS 1.3 paketlerini belirten bir liste yalnızca TLS 1.3 verir, iki sürümün paketlerini de belirten bir liste ise ikisine de izin verir. Version değeri tls1_3 iken TLS 1.2 paketlerinden oluşan bir liste, müzakere edilecek hiçbir sürüm bırakmaz ve bağlantı başladığında hata verir.

 


// TLS 1.3 and TLS 1.2, tls1_2 is the lowest version allowed
oClient.TLSOptions.IOHandler := iohNativeTLS;
oClient.TLSOptions.Version := tls1_2;

// TLS 1.3 only
oClient.TLSOptions.Version := tls1_3;

// TLS 1.2 only: name TLS 1.2 suites and no TLS 1.3 suite
oClient.TLSOptions.Version := tls1_2;
oClient.TLSOptions.NativeTLS_Options.CipherSuites :=
  'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256';

 

Gruplar ve şifre paketleri

 

Bir istemcide TLSOptions.NativeTLS_Options ve bir sunucuda SSLOptions.NativeTLS_Options, iki tercih listesini taşır. İkisi de OpenSSL biçiminde dizelerdir, öğeler iki nokta üst üste ile ayrılır, en çok tercih edilen başta olur, ve tek bir liste TLS 1.3 ile TLS 1.2'ye birlikte hizmet eder. Motorun varsayılanını korumak için birini boş bırakın. Geçersiz bir liste, bağlantı başladığında hata verir, böylece bir yazım hatası sessizce göz ardı edilmez.

 

Özellik Kabul edilen adlar Varsayılan
Groups X25519MLKEM768, SecP256r1MLKEM768, SecP384r1MLKEM1024, X25519, secp256r1, secp384r1. P-256, prime256v1 ve P-384 takma adları da kabul edilir ve adlar büyük küçük harf ayrımı gözetilmeden karşılaştırılır. Üç hibrit grup yalnızca TLS 1.3'te bulunur. X25519MLKEM768:X25519:secp256r1:secp384r1
CipherSuites TLS 1.3: TLS_AES_256_GCM_SHA384, TLS_CHACHA20_POLY1305_SHA256, TLS_AES_128_GCM_SHA256. TLS 1.2: aşağıdaki tablodaki paketler. Hem IANA adları hem de ECDHE-RSA-AES128-GCM-SHA256 gibi OpenSSL biçimi adlar kabul edilir, ve motor IANA adını bildirir. TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256, artı aşağıdaki TLS 1.2 varsayılanları

 

Listedeki ilk grup, bir istemcinin anahtar paylaşımı gönderdiği gruptur, bu yüzden X25519MLKEM768 değerini başta bırakmak, ilk uçuşu zaten kuantum sonrası yapan şeydir. Bir öğenin önüne soru işareti koymak, bu yapıda o öğe yoksa onu atlar; bilinmeyen veya kullanılamayan başka herhangi bir öğe ise listenin tamamını başarısız kılar.

 


// only the hybrid post-quantum groups, and only AES-256-GCM
oClient.TLSOptions.NativeTLS_Options.Groups :=
  'X25519MLKEM768:SecP256r1MLKEM768:SecP384r1MLKEM1024';
oClient.TLSOptions.NativeTLS_Options.CipherSuites := 'TLS_AES_256_GCM_SHA384';

// tolerate a build where X25519 is not compiled in
oClient.TLSOptions.NativeTLS_Options.Groups := '?X25519MLKEM768:secp256r1';

 

TLS 1.2 şifre paketleri

 

Varsayılan olarak yalnızca ileri gizlilik sağlayan AEAD paketleri etkindir. AES-CBC paketleri ve RSA anahtar değişimi, daha iyisini yapamayan eşler içindir ve yalnızca CipherSuites onları belirttiğinde sunulur veya kabul edilir.

 

Paketler Etkin
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 Varsayılan olarak, bu sırayla.
TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 Yalnızca CipherSuites içinde belirtildiğinde.
TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA256 Yalnızca CipherSuites içinde belirtildiğinde. RSA anahtar değişiminde ileri gizlilik yoktur.

 

Bir TLS 1.2 bağlantısının ECDHE paketleri, Groups listesinden klasik bir grup kullanır: X25519, secp256r1 veya secp384r1, bu yüzden TLS 1.2 eşlerinin bağlanabilmesi gerekiyorsa bunlardan en az birini listede tutun. RSA anahtar değişimi hiçbir grup kullanmaz.

 


// TLS 1.3, and TLS 1.2 with AES-GCM plus AES-CBC for older clients
oServer.SSLOptions.IOHandler := iohNativeTLS;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.NativeTLS_Options.CipherSuites :=
  'TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:' +
  'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384:TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256:' +
  'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA';

 

SGC_CRYPTO_FIPS ile yapılmış bir derlemede X25519 üzerine kurulu iki grup, ChaCha20-Poly1305 paketleri ve RSA anahtar değişimi derleme dışı bırakılır, ve varsayılanlar SecP256r1MLKEM768:SecP384r1MLKEM1024:secp256r1:secp384r1 ve TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256 olarak değişir, TLS 1.2 için dört ECDHE AES-GCM paketiyle birlikte. Bkz. FIPS Modu.

 

TLS 1.2 davranışı

 

TLS 1.2, modern bir eşin beklediği korumalarla ve bilinen saldırılarına yol açan protokol kısımları olmadan uygulanmıştır.

 

Oturum sürdürme

Motor, TLS 1.3'te (RFC 8446) ve TLS 1.2'de (RFC 5077) durumsuz oturum biletleriyle oturumları sürdürür. Tam bir el sıkışmadan sonra sunucu, yalnızca sunucunun sahip olduğu bir anahtar altında AES-256-GCM ile mühürlenmiş bir bilet gönderir. İstemci bunu, ana bilgisayar, bağlantı noktası ve ALPN listesiyle anahtarlanan bir oturum önbelleğinde tutar ve bir sonraki bağlantıda sunar, bu da sertifika alışverişini atlar. Sunucunun açamadığı veya süresi dolmuş bir bilet, yeni bir biletle tam bir el sıkışma verir.

Özellik Varsayılan Anlamı
NativeTLS_Options.SessionTickets True Bir sunucu bilet verir ve bir istemci bunları saklayıp sunar. False, sürdürmeyi kapatır, o zaman her el sıkışma tam bir el sıkışma olur.
NativeTLS_Options.TicketLifetime 7200 Yalnızca sunucu. Bir biletin sürdürmek için kullanılabileceği saniye sayısı, en fazla 604800. Sunucu bilet anahtarı her TicketLifetime saniyede bir döner, ve önceki anahtar bir dönem daha geçerli kalır.

Seçenekler, bir istemcide TLSOptions.NativeTLS_Options ve bir sunucuda SSLOptions.NativeTLS_Options'tür. Oturum önbelleği her istemci bileşenine aittir, bu yüzden aynı TsgcWebSocketClient, TsgcHTTP1Client, TsgcTCPClient veya TsgcLDAPClient'ın yeniden bağlanmaları sürdürülür, ve TsgcWebSocketProxyServer'ın yukarı akış bağlantısı da öyle.

TLS 1.2 sürdürme, RFC 7627'nin genişletilmiş ana sırrını gerektirir. Bu olmadan bir TLS 1.2 oturumu hiçbir zaman sürdürülmez ve bilet almaz, ve sunucu bir istemci sertifikası istediğinde de bilet verilmez. Bir TLS 1.3 bileti hiçbir zaman bir TLS 1.2 oturumu olarak açılmaz, ve tam tersi de olmaz.

Bir bağlantının sürdürülüp sürdürülmediği, aşağıda açıklanan işleyici olan TsgcIdSSLIOHandlerSocketNativeTLS'in Resumed özelliği ile bildirilir.

 

Ne müzakere edildi

 

El sıkışma tamamlandığında, sgcSSL_NativeTLS_Indy biriminde bulunan istemci işleyicisi TsgcIdSSLIOHandlerSocketNativeTLS, sonucu bildirir. VersionName, TLSv1.2 veya TLSv1.3'tür, CipherSuiteName, paketin IANA adıdır, GroupName, anahtar değişim grubudur, RSA anahtar değişiminde boştur, ve PeerSignatureSchemeName, sunucunun kullandığı imza şemasıdır. İşleyici, istemcinin OnSSLAfterCreateHandler'a geçirdiği işleyicidir.

 


procedure TForm1.oClientSSLAfterCreateHandler(Sender: TObject;
  aType: TwsSSLHandler; aSSLHandler: TIdSSLIOHandlerSocketBase);
begin
  FHandler := aSSLHandler;
end;

procedure TForm1.oClientConnect(Connection: TsgcWSConnection);
var
  oHandler: TsgcIdSSLIOHandlerSocketNativeTLS;
begin
  if FHandler is TsgcIdSSLIOHandlerSocketNativeTLS then
  begin
    oHandler := TsgcIdSSLIOHandlerSocketNativeTLS(FHandler);
    Memo1.Lines.Add(oHandler.VersionName + ' ' + oHandler.CipherSuiteName +
      ' ' + oHandler.GroupName + ' ' + oHandler.PeerSignatureSchemeName);
  end;
end;

 

Sertifikalar ve doğrulama

 

Bir sunucu, CertFile, KeyFile ve Password değerlerini okur. CertFile ve KeyFile PEM olabilir, ya da CertFile, uzantısından tanınan bir .pfx veya .p12 dosyası olabilir. Bir PKCS#12 dosyası sertifikayı, zinciri ve özel anahtarı taşır, bu yüzden KeyFile gerekmez, ve Password ile açılır. sgcCrypto_PKCS12'nin saf Pascal PKCS#12 okuyucusuyla, hiç OpenSSL olmadan okunur. VerifyCertificate değerini True yapan bir istemci, sunucu zincirini aşağıda açıklanan güvenilir köklere karşı denetler ve adın bağlandığı ana bilgisayarla eşleştiğini denetler. VerifyDepth aktarılır, ve 16'dan büyük bir değer 16'ya çekilir.

 

Güvenilir kökler, RootCertFile içindeki sertifikalardır. NativeTLS_Options.UseSystemRoots değerini True yapmak, işletim sisteminin güvendiği sertifika yetkililerini ekler. Varsayılan olarak False'tur. İkisi birleşir: önce RootCertFile'ın kökleri yüklenir, sistem kökleri aynı depoya eklenir, ve bir zincir bunlardan herhangi birine ulaştığında kabul edilir. Hiçbir sistem kökü bulunamadığında hiçbir şey eklenmez ve hiçbir hata verilmez, böylece doğrulama yalnızca RootCertFile'a dayanır. Özellik, bir istemcide TLSOptions.NativeTLS_Options.UseSystemRoots ve bir sunucuda SSLOptions.NativeTLS_Options.UseSystemRoots'tür; sunucuda kökler yalnızca istemci sertifikalarını doğrulamaya hizmet eder. Sistem köklerinin nereden geldiği platforma bağlıdır:

Bir sertifika dosyaları klasörünü kendiniz yüklemek için, sgcSSL_NativeTLS_Certificates biriminde bulunan TsgcTLS13TrustStore.AddDirectory(aDirectory, aRemovedDirectory), aDirectory'deki her PEM veya DER dosyasını okur, adı aRemovedDirectory içinde de bulunan her dosyayı atlar, ve kaç sertifika eklediğini döndürür. Her platformda çalışır.

 

Bağlantı ana bilgisayarını kullanmak yerine sertifikanın taşıması gereken adı sabitlemek için, X509Checks.Mode içindeki eşleşen bayrakla birlikte TLSOptions.OpenSSL_Options.X509Checks.HostName veya IPAddress değerini ayarlayın. Motor, OpenSSL olmamasına rağmen bu iki değeri okur, böylece özellik, hangi IOHandler seçilmiş olursa olsun aynı anlama gelir.

 

Bir sunucuda SSLOptions.VerifyCertificate, istemciden bir sertifika ister ve onu yukarıda açıklanan güvenilir köklere karşı doğrular, ve SSLOptions.VerifyCertificate_Options.FailIfNoCertificate, hiç sertifika göndermeyen bir istemciyi reddeder. VerifyClientOnce burada bir işe yaramaz. TLS 1.3'te yeniden müzakere yoktur ve motor bunu TLS 1.2'de reddeder, bu yüzden ikinci kez hiç sormaz.

 

ALPN her zamanki gibi, bir istemcide ALPNProtocols aracılığıyla ve sunucu ALPN seçimi aracılığıyla çalışır, böylece yerel motor üzerinden HTTP/2, h2 değerini OpenSSL üzerinden yaptığı gibi müzakere eder. Bkz. ALPN.

QUIC modu

Motor ayrıca QUIC ve HTTP/3'ün TLS 1.3 el sıkışmasını da yürütür (RFC 9001). TsgcQUICClient üzerinde SSLQUICOptions.IOHandler'ı, TsgcHTTP3Client üzerinde TLSOptions.IOHandler'ı, TsgcQUICServer ve TsgcHTTP3Server üzerinde QUICOptions.SSLOptions.IOHandler'ı, veya HTTP3Options.Enabled ile bir sunucuda SSLOptions.IOHandler'ı iohNativeTLS olarak ayarlayın.

Motor karşılaştırması için bkz. QUIC.

 

Yapmadıkları

 

Motor bilinçli olarak dardır. Aşağıdaki her şey gerçek bir sınırdır, aranacak bir ayar değildir.

 

 

Eşin gönderdiği hiçbir şey bir hata oluşturmaz. Bir protokol hatası, bağlantıyı uygun TLS uyarısıyla sonlandırır ve neden, her zamanki gibi bileşen hata olayları aracılığıyla bildirilir.

AES-GCM ve AES-CBC kayıt koruması, CPU'da bulunduklarında, Delphi ile yapılmış Windows derlemelerinde AES-NI ve PCLMULQDQ komutlarını kullanır, bkz. Simetrik Şifreleme içindeki sgcAES_HardwareAvailable. Kitaplığın hiçbir parçasının OpenSSL yüklemediği bir derleme için, bkz. OpenSSL Olmadan Çalıştırma.