OpenSSL è una libreria software per applicazioni che proteggono le comunicazioni su reti informatiche dalle intercettazioni o che devono identificare la controparte. È ampiamente utilizzata dai server Internet, inclusa la maggior parte dei siti HTTPS.
Questa libreria è richiesta dai componenti basati sulla libreria Indy quando è necessaria una connessione sicura. Se l'applicazione richiede OpenSSL, è necessario che i file necessari siano presenti nel file system prima di distribuire l'applicazione:
Attualmente, sgcWebSockets supporta le versioni: 1.0.2, 1.1 e 3.0 a 3.3 openSSL.
| Platform | API 1.0 | API 1.1 | API 3.* | Collegamento statico/dinamico |
|---|---|---|---|---|
| Windows (32-bit e 64-bit) | libeay32.dll and ssleay32.dll | libcrypto-1_1.dll and libssl-1_1.dll | libcrypto-3.dll e libssl-3.dll | Dinamico |
| OSX | libcrypto.dylib, libssl.dylib | libcrypto.1.1.dylib, libssl.1.1.dylib | libcrypto.3.dylib, libssl.3.dylib | Dinamico |
| iOS Device (32-bit and 64-bit) | libcrypto.a e libssl.a | libcrypto.a e libssl.a | libcrypto.a e libssl.a | Statico |
| iOS Simulator | libcrypto.dylib, libssl.dylib | libcrypto.1.1.dylib, libssl.1.1.dylib | libcrypto.3.dylib, libssl.3.dylib | Dinamico |
| Dispositivo Android | libcrypto.so, libssl.so | libcrypto.so, libssl.so | libcrypto.so, libssl.so | Dinamico |
Trovi di seguito come configurare OpenSSL per ciascuna piattaforma:
I componenti di sgcWebSockets basati su Indy Le consentono di configurare alcune proprietà di OpenSSL. Accesso alle seguenti proprietà:
Versione API
La libreria Indy standard consente solo il caricamento delle librerie OpenSSL 1.0.2; queste librerie sono state deprecate e le ultime versioni di OpenSSL utilizzano l'API 1.1.1.
sgcWebSockets Enterprise consente di caricare le librerie 1.1.1 openSSL; in questa proprietà è possibile configurare quale versione dell'API openSSL verrà caricata. Solo una versione dell'API può essere caricata per processo (quindi non è possibile combinare le librerie openSSL 1.0.2 e 1.1.1 nella stessa applicazione).
LibPath
Questa proprietà consente di impostare la posizione delle librerie openSSL. È utile per i progetti Android o OSX, dove è necessario impostare la posizione delle librerie openSSL.
Accetta i seguenti valori:
Utilizzare un callback per caricare funzioni OpenSSL aggiuntive non definite per impostazione predefinita. Per ulteriori informazioni consultare OpenSSL: caricamento di funzioni aggiuntive.
Se si desidera fornire supporto per TLS 1.2 e 1.3 sul proprio server utilizzando la migliore sicurezza e prestazioni, utilizzare la seguente configurazione:
SSLOptions.Version := tls1_3;
SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
SSLOptions.OpenSSL_Options.APIVersion := oslAPI_3_0;
E impostare il seguente elenco di cifrature.
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
È possibile utilizzare certificati auto-firmati a scopo di test. È sufficiente eseguire il seguente comando per creare un certificato auto-firmato:
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
Verranno creati 2 file: cert.pem (certificato) e key.pem (chiave privata). È possibile combinare entrambi i file in uno solo. È sufficiente creare un nuovo file e copiare il contenuto di entrambi i file in esso. Si otterrà così una struttura simile alla seguente:
-----BEGIN PRIVATE KEY-----
....
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
SSL_GET_RECORD: wrong version number
Questo errore indica che il server e il client stanno utilizzando versioni diverse del protocollo SSL/TLS. Per risolvere il problema, provare a impostare la versione corretta nel componente server e/o client.
Server.SSLOptions.Version
Client.TLSOptions.Version
SSL3_GET_RECORD: decryption failed or bad record mac
Solitamente questo errore si genera quando:
1. Verificare che si stia utilizzando la versione più recente di OpenSSL. Se è troppo vecchia, aggiornare alla versione supportata più recente.
2. Se questo errore compare in modo casuale, di solito è perché più di un thread sta accedendo alla connessione OpenSSL. Può provare a impostare NotifyEvents = neNoSync, il che significa che gli eventi: OnConnect, OnDisconnect, OnMessage... verranno generati nel contesto del thread di connessione, questo evita alcuni problemi di sincronizzazione e fornisce prestazioni migliori. Come aspetto negativo, se ad esempio sta aggiornando un controllo visivo in un form quando riceve un messaggio, deve implementare i Suoi metodi di sincronizzazione perché i controlli visivi non sono thread-safe.