OpenSSL

OpenSSL to biblioteka oprogramowania dla aplikacji zabezpieczających komunikację w sieciach komputerowych przed podsłuchem lub wymagających identyfikacji strony zdalnej. Jest szeroko stosowana przez serwery internetowe, w tym przez zdecydowaną większość witryn HTTPS.

 

Ta biblioteka jest wymagana przez komponenty oparte na bibliotece Indy, gdy wymagane jest bezpieczne połączenie. Jeśli aplikacja wymaga OpenSSL, przed wdrożeniem aplikacji należy upewnić się, że niezbędne pliki są obecne w systemie plików:

 

Aktualnie sgcWebSockets obsługuje wersje OpenSSL: 1.0.2, 1.1 oraz 3.0 do 3.3.

 

Platforma API 1.0 API 1.1 API 3.* Linkowanie statyczne/dynamiczne
Windows (32-bit i 64-bit) libeay32.dll and ssleay32.dll libcrypto-1_1.dll and libssl-1_1.dll libcrypto-3.dll i libssl-3.dll Dynamiczny
OSX libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib Dynamiczny
Urządzenie iOS (32-bitowe i 64-bitowe) libcrypto.a i libssl.a libcrypto.a i libssl.a libcrypto.a i libssl.a Statyczna
Symulator iOS libcrypto.dylib, libssl.dylib libcrypto.1.1.dylib, libssl.1.1.dylib libcrypto.3.dylib, libssl.3.dylib Dynamiczny
Urządzenie Android libcrypto.so, libssl.so libcrypto.so, libssl.so libcrypto.so, libssl.so Dynamiczny

 

 

Poniżej opisano sposób konfiguracji bibliotek OpenSSL dla każdej platformy:

 

 

Konfiguracje openSSL

Komponenty sgcWebSockets oparte na Indy umożliwiają konfigurację wybranych właściwości OpenSSL. Dostępne są następujące właściwości:

 

 

Wersja API

 

Standardowa biblioteka Indy umożliwia ładowanie wyłącznie bibliotek OpenSSL 1.0.2, które zostały wycofane, a najnowsze wersje OpenSSL korzystają z API 1.1.1.

sgcWebSockets Enterprise umożliwia ładowanie bibliotek openSSL 1.1.1. W tej właściwości można skonfigurować, która wersja API openSSL zostanie załadowana. Na jeden proces może być załadowana tylko jedna wersja API (nie można mieszać bibliotek openSSL 1.0.2 i 1.1.1 w tej samej aplikacji).

 

 

LibPath

 

Ta właściwość umożliwia ustawienie lokalizacji bibliotek openSSL. Jest to przydatne w projektach dla systemu Android lub OSX, gdzie lokalizacja bibliotek openSSL musi być określona.

Akceptuje następujące wartości:

 

 

 

Ładowanie dodatkowych funkcji OpenSSL

Użyj wywołania zwrotnego, aby załadować dodatkowe funkcje OpenSSL niezdefiniowane domyślnie. Więcej informacji można znaleźć pod adresem OpenSSL Load Additional Functions.

 

Szyfry

Aby zapewnić obsługę TLS 1.2 i 1.3 na serwerze przy użyciu najwyższego poziomu bezpieczeństwa i wydajności, należy zastosować następującą konfigurację:

 

SSLOptions.Version := tls1_3;

SSLOptions.OpenSSL_Options.VersionMin := tls1_2;

SSLOptions.OpenSSL_Options.APIVersion := oslAPI_3_0;

 

Następnie ustaw poniższą listę szyfrów.

 

AEAD-AES128-GCM-SHA256:AEAD-AES256-GCM-SHA384:AEAD-CHACHA20-POLY1305-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

 

Certyfikaty z podpisem własnym

Do celów testowych można używać certyfikatów z podpisem własnym. Wystarczy wykonać następujące polecenie, aby utworzyć certyfikat z podpisem własnym:

 

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

Zostaną utworzone 2 pliki: cert.pem (certyfikat) i key.pem (klucz prywatny). Oba pliki można połączyć w jeden. Należy utworzyć nowy plik i skopiować do niego zawartość obu plików. Uzyskana struktura będzie wyglądać następująco:

 

-----BEGIN PRIVATE KEY-----

....

-----END PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

....

-----END CERTIFICATE-----

 

Typowe błędy

SSL_GET_RECORD: wrong version number

 

Błąd ten oznacza, że serwer i klient używają różnych wersji protokołu SSL/TLS. Aby naprawić ten problem, należy ustawić właściwą wersję w komponencie serwera lub klienta.

 

Server.SSLOptions.Version

Client.TLSOptions.Version

 

SSL3_GET_RECORD: decryption failed or bad record mac

 

Zwykle ten błąd pojawia się, gdy:

 

1. Należy sprawdzić, czy jest używana najnowsza wersja OpenSSL. Jeśli jest zbyt stara, należy zaktualizować ją do najnowszej obsługiwanej wersji.

2. Jeśli ten błąd pojawia się losowo, zazwyczaj oznacza to, że więcej niż jeden wątek uzyskuje dostęp do połączenia OpenSSL. Można spróbować ustawić NotifyEvents = neNoSync, co oznacza, że zdarzenia: OnConnect, OnDisconnect, OnMessage... będą wywoływane w kontekście wątku połączenia — unika to pewnych problemów z synchronizacją i zapewnia lepszą wydajność. Wadą jest to, że na przykład podczas aktualizowania kontrolki wizualnej w formularzu po odebraniu wiadomości, należy samodzielnie implementować metody synchronizacji, ponieważ kontrolki wizualne nie są bezpieczne wątkowo.