OpenSSL est une bibliothèque logicielle pour les applications qui sécurisent les communications sur les réseaux informatiques contre l'espionnage ou qui ont besoin d'identifier la partie à l'autre bout. Elle est largement utilisée par les serveurs Internet, notamment la majorité des sites HTTPS.
Cette bibliothèque est requise par les composants basés sur la bibliothèque Indy lorsqu'une connexion sécurisée est nécessaire. Si votre application nécessite OpenSSL, vous devez avoir les fichiers nécessaires dans votre système de fichiers avant de déployer votre application :
Actuellement, sgcWebSockets prend en charge les versions : 1.0.2, 1.1 et 3.0 à 3.3 openSSL.
| Plateforme | API 1.0 | API 1.1 | API 3.* | Liaison statique/dynamique |
|---|---|---|---|---|
| Windows (32 bits et 64 bits) | libeay32.dll and ssleay32.dll | libcrypto-1_1.dll and libssl-1_1.dll | libcrypto-3.dll et libssl-3.dll | Dynamique |
| OSX | libcrypto.dylib, libssl.dylib | libcrypto.1.1.dylib, libssl.1.1.dylib | libcrypto.3.dylib, libssl.3.dylib | Dynamique |
| Appareil iOS (32 bits et 64 bits) | libcrypto.a et libssl.a | libcrypto.a et libssl.a | libcrypto.a et libssl.a | Statique |
| Simulateur iOS | libcrypto.dylib, libssl.dylib | libcrypto.1.1.dylib, libssl.1.1.dylib | libcrypto.3.dylib, libssl.3.dylib | Dynamique |
| Appareil Android | libcrypto.so, libssl.so | libcrypto.so, libssl.so | libcrypto.so, libssl.so | Dynamique |
Découvrez ci-dessous comment configurer les bibliothèques OpenSSL pour chaque plateforme :
Les composants sgcWebSockets basés sur Indy vous permettent de configurer certaines propriétés OpenSSL. Accédez aux propriétés suivantes :
Version de l'API
La bibliothèque Indy standard ne permet de charger que les bibliothèques OpenSSL 1.0.2 ; ces bibliothèques ont été dépréciées et les dernières versions d'OpenSSL utilisent l'API 1.1.1.
sgcWebSockets Enterprise vous permet de charger les bibliothèques openSSL 1.1.1 ; vous pouvez configurer dans cette propriété quelle version de l'API openSSL sera chargée. Une seule version de l'API peut être chargée par processus (vous ne pouvez donc pas mélanger les bibliothèques openSSL 1.0.2 et 1.1.1 dans la même application).
LibPath
Cette propriété vous permet de définir l'emplacement des bibliothèques openSSL. Ceci est utile pour les projets Android ou OSX, où l'emplacement des bibliothèques openSSL doit être défini.
Accepte les valeurs suivantes :
Utilisez un callback pour charger des fonctions OpenSSL supplémentaires non définies par défaut. Vous pouvez en savoir plus sur Chargement de fonctions OpenSSL supplémentaires.
Si vous souhaitez fournir la prise en charge de TLS 1.2 et 1.3 sur votre serveur avec la meilleure sécurité et performance, utilisez la configuration suivante :
SSLOptions.Version := tls1_3;
SSLOptions.OpenSSL_Options.VersionMin := tls1_2;
SSLOptions.OpenSSL_Options.APIVersion := oslAPI_3_0;
Et définissez la liste de chiffrement suivante.
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
Vous pouvez utiliser des certificats auto-signés à des fins de test. Il vous suffit d'exécuter la commande suivante pour créer un certificat auto-signé :
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
Cela créera 2 fichiers : cert.pem (certificat) et key.pem (clé privée). Vous pouvez combiner les deux fichiers en un seul. Il suffit de créer un nouveau fichier et d'y copier le contenu des deux fichiers. Vous obtiendrez alors une structure comme celle-ci :
-----BEGIN PRIVATE KEY-----
....
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
....
-----END CERTIFICATE-----
SSL_GET_RECORD: wrong version number
Cette erreur signifie que le serveur et le client utilisent des versions différentes du protocole SSL/TLS. Pour y remédier, essayez de définir la version correcte dans le composant serveur et/ou client.
Server.SSLOptions.Version
Client.TLSOptions.Version
SSL3_GET_RECORD: decryption failed or bad record mac
Généralement, cette erreur est déclenchée lorsque :
1. Vérifiez que vous utilisez la dernière version d'OpenSSL. Si elle est trop ancienne, mettez-la à jour vers la dernière version supportée.
2. Si cette erreur apparaît de manière aléatoire, c'est généralement parce que plus d'un thread accède à la connexion OpenSSL. Vous pouvez essayer de définir NotifyEvents = neNoSync, ce qui signifie que les événements : OnConnect, OnDisconnect, OnMessage... seront déclenchés dans le contexte du thread de connexion, cela évite certains problèmes de synchronisation et offre de meilleures performances. En contrepartie, si par exemple vous mettez à jour un contrôle visuel dans un formulaire lorsque vous recevez un message, vous devez implémenter vos propres méthodes de synchronisation car les contrôles visuels ne sont pas thread-safe.