Après trois ans de développement et 19 versions de test, la bibliothèque OpenSSL 3.0.0 a été publiée, implémentant les protocoles SSL/TLS et divers algorithmes de cryptage. Cette nouvelle branche inclut des modifications qui rompent la compatibilité avec les versions précédentes au niveau de l'API et de l'ABI, mais ces changements n'affecteront pas le fonctionnement de la plupart des applications, pour lesquelles une recompilation basée sur OpenSSL 1.1.1 est suffisante. Le support de l'ancienne branche OpenSSL 1.1.1 sera maintenu jusqu'en septembre 2023.
Le changement significatif du numéro de version est lié à l'adoption d'une numérotation traditionnelle « Major.Minor.Patch ». Le premier chiffre (Major) dans le numéro de version ne changera désormais que lors de modifications qui rompent la compatibilité au niveau de l'API/ABI, tandis que le second (Minor) sera modifié lors de l'ajout de fonctionnalités sans changer l'API/ABI. Les mises à jour correctives seront fournies avec un changement du troisième chiffre (Patch). Le numéro 3.0.0 a été choisi immédiatement après 1.1.1 pour éviter les chevauchements avec le module FIPS en développement pour OpenSSL, qui utilisait la numérotation 2.x.
Un autre changement important pour le projet a été le passage d'une double licence (OpenSSL et SSLeay) à la licence Apache 2.0. L'ancienne licence propriétaire d'OpenSSL était basée sur le texte d'une licence Apache 1.0 obsolète et exigeait une mention explicite d'OpenSSL dans les supports publicitaires lors de l'utilisation des bibliothèques OpenSSL, ainsi qu'ajouter une note spéciale en cas de fourniture d'OpenSSL dans le cadre d'un produit. De telles exigences rendaient l'ancienne licence incompatible avec la GPL, ce qui compliquait l'utilisation d'OpenSSL dans des projets sous licence GPL. Pour contourner cette incompatibilité, les projets GPL étaient contraints d'utiliser des accords de licence spécifiques, qui complétaient le texte principal de la GPL par une clause autorisant explicitement le lien d'une application avec la bibliothèque OpenSSL et mentionnant que les exigences de la GPL ne s'appliquent pas au lien avec OpenSSL.
Comparativement à la branche OpenSSL 1.1.1, OpenSSL 3.0.0 introduit plus de 7500 modifications, préparées par 350 développeurs. Les principales nouveautés d'OpenSSL 3.0.0 :
- Un nouveau module FIPS a été proposé, incluant la mise en œuvre d'algorithmes cryptographiques conformes à la norme de sécurité FIPS 140-2 (le processus de certification du module est prévu pour ce mois-ci, et l'obtention du certificat FIPS 140-2 est attendue l'année prochaine). Ce nouveau module est grandement simplifié et sa connexion à de nombreuses applications nécessitera seulement une modification du fichier de configuration. Par défaut, le module FIPS est désactivé et nécessite l'option enable-fips pour être activé.
- Dans libcrypto, un concept de fournisseurs plug-in a été mis en place, remplaçant l'ancien concept de moteurs (l'API ENGINE est obsolète). Grâce aux fournisseurs, il est possible d'ajouter ses propres mises en œuvre d'algorithmes pour des opérations telles que le cryptage, le décryptage, la génération de clés, le calcul de MAC et la création et la vérification de signatures numériques. Il est possible d'ajouter de nouveaux fournisseurs ainsi que de créer des mises en œuvre alternatives d'algorithmes déjà pris en charge (par défaut, chaque algorithme utilise désormais le fournisseur intégré d'OpenSSL).
- Le protocole de gestion des certificats CMP (Certificate Management Protocol, RFC 4210) a été ajouté, permettant de demander des certificats à de serveurs une autorité de certification, de mettre à jour des certificats et de révoquer des certificats. Le travail avec CMP est effectué par le biais de la nouvelle utilité openssl-cmp, qui prend également en charge le format CRMF (RFC 4211) et la transmission de requêtes via HTTP/HTTPS (RFC 6712).
- Un client complet pour les protocoles HTTP et HTTPS a été mis en œuvre, prenant en charge les méthodes GET et POST, le redirection des requêtes, l'utilisation de proxy, l'encodage ASN.1 et le traitement des délais d'attente.
- Une nouvelle API EVP_MAC (API de code d'authentification de message) a été ajoutée, simplifiant l'ajout de nouvelles mises en œuvre de codes d'authentification.
- Une nouvelle interface de programmation pour la génération de clés — EVP_KDF (API de fonction de dérivation de clé) — a été proposée, simplifiant l'ajout de nouvelles mises en œuvre de KDF et PRF. L'ancienne API EVP_PKEY, à travers laquelle étaient accessibles les algorithmes scrypt, TLS1 PRF et HKDF, a été remaniée sous forme de couche, mise en œuvre au-dessus des API EVP_KDF et EVP_MAC.
- Dans l'implémentation du protocole TLS, il est désormais possible d'utiliser les fonctionnalités TLS intégrées dans le noyau Linux pour accélérer les opérations. Pour activer l'implémentation TLS fournie par le noyau Linux, il est nécessaire d'activer l'option « SSL_OP_ENABLE_KTLS » ou d'utiliser la configuration « enable-ktls ».
- Prise en charge de nouveaux algorithmes :
- Les algorithmes de génération de clés (KDF) — «SINGLE STEP» et «SSH».
- Les algorithmes de code d'authentification de message (MAC) — «GMAC» et «KMAC».
- L'algorithme de encapsulation de clés RSA (KEM) «RSASVE».
- L'algorithme de chiffrement «AES-SIV» (RFC-8452).
- L'API EVP a ajouté des appels prenant en charge les chiffres inversés, utilisant l'algorithme AES pour chiffrer les clés (Key Wrap) : «AES-128-WRAP-INV», «AES-192-WRAP-INV», «AES-256-WRAP-INV», «AES-128-WRAP-PAD-INV», «AES-192-WRAP-PAD-INV» et «AES-256-WRAP-PAD-INV».
- L'API EVP a ajouté le support des algorithmes de détournement de texte chiffré (CTS) : «AES-128-CBC-CTS», «AES-192-CBC-CTS», «AES-256-CBC-CTS», «CAMELLIA-128-CBC-CTS», «CAMELLIA-192-CBC-CTS» et «CAMELLIA-256-CBC-CTS».
- Ajout du support des signatures numériques CAdES-BES (RFC 5126).
- Dans AES_GCM, le paramètre AuthEnvelopedData (RFC 5083) a été implémenté, permettant de chiffrer et de déchiffrer des messages authentifiés et chiffrés en utilisant le mode AES GCM.
- Les fonctions PKCS7_get_octet_string et PKCS7_type_is_other ont été extraites dans l'API publique.
- Dans l'API PKCS#12, les algorithmes appliqués par défaut dans la fonction PKCS12_create() ont été remplacés par PBKDF2 et AES, et l'algorithme SHA-256 a été utilisé pour le calcul du MAC. Une option «-legacy» a été prévue pour restaurer le comportement précédent. Un grand nombre de nouveaux appels étendus PKCS12_*_ex, PKCS5_*_ex et PKCS8_*_ex ont été ajoutés, tels que PKCS12_add_key_ex(), PKCS12_create_ex() et PKCS12_decrypt_skey_ex().
- Pour la plateforme Windows, le support de la synchronisation des threads a été ajouté via le mécanisme SRWLock.
- Une nouvelle API pour le traçage a été ajoutée, activée par le paramètre enable-trace.
- La gamme de clés prises en charge dans les fonctions EVP_PKEY_public_check() et EVP_PKEY_param_check() a été élargie : RSA, DSA, ED25519, X25519, ED448 et X448.
- Le sous-système RAND_DRBG a été supprimé, remplacé par l'API EVP_RAND. Les fonctions FIPS_mode() et FIPS_mode_set() ont été supprimées.
- Une partie significative de l'API a été classée comme obsolète : l'utilisation d'appels obsolètes dans le code des projets entraînera des avertissements lors de la compilation. Les API de bas niveau liées à des implémentations spécifiques d'algorithmes (comme AES_set_encrypt_key et AES_encrypt) ont également été déclarées obsolètes. Le support officiel dans OpenSSL 3.0.0 est désormais assuré uniquement pour les API de haut niveau EVP, abstraites des types d'algorithmes particuliers (ceci inclut, par exemple, les fonctions EVP_EncryptInit_ex, EVP_EncryptUpdate et EVP_EncryptFinal). Dans l'un des prochains lancements majeurs, les API obsolètes seront supprimées. Les implémentations des algorithmes obsolètes, tels que MD2 et DES, accessibles via l'API EVP, ont été déplacées dans un module distinct « legacy », qui est désactivé par défaut.
- La documentation et le jeu de tests ont été considérablement élargis. Par rapport à la branche 1.1.1, le volume de la documentation a augmenté de 94%, et la taille du code du jeu de tests de 54%.
Source : opennet.ru
