Dopo tre anni di sviluppo e 19 versioni di prova, è stato rilasciato OpenSSL 3.0.0, con l'implementazione dei protocolli SSL/TLS e vari algoritmi di crittografia. Il nuovo ramo include modifiche che rompono la compatibilità all'interno dell'API e dell'ABI, ma tali modifiche non influenzeranno il funzionamento della maggior parte delle applicazioni, per le quali è sufficiente ricompilare da OpenSSL 1.1.1. Il supporto per il precedente ramo OpenSSL 1.1.1 sarà garantito fino a settembre 2023.
Il cambiamento significativo del numero di versione è legato al passaggio alla numerazione tradizionale «Major.Minor.Patch». Da ora in poi, il primo numero (Major) cambierà solo in caso di rottura della compatibilità a livello API/ABI, mentre il secondo numero (Minor) cambierà quando si aggiungono funzionalità senza modificare l'API/ABI. Gli aggiornamenti correttivi saranno forniti con la modifica del terzo numero (Patch). Il numero 3.0.0 è stato scelto subito dopo 1.1.1 per evitare sovrapposizioni con il modulo FIPS per OpenSSL, che utilizza la numerazione 2.x.
Un altro cambiamento importante per il progetto è stato il passaggio da una doppia licenza (OpenSSL e SSLeay) alla licenza Apache 2.0. La precedente licenza proprietaria di OpenSSL si basava sul testo di una vecchia licenza Apache 1.0 e richiedeva una menzione esplicita di OpenSSL nel materiale pubblicitario quando si utilizzavano le librerie OpenSSL, oltre a un'apposita nota in caso di distribuzione di OpenSSL all'interno di un prodotto. Tali requisiti rendevano la vecchia licenza incompatibile con la GPL, creando difficoltà nell'utilizzo di OpenSSL in progetti con licenza GPL. Per aggirare questa incompatibilità, i progetti GPL erano costretti ad adottare specifici accordi di licenza, in cui il testo principale della GPL veniva integrato con una clausola che autorizzava esplicitamente il collegamento dell'applicazione con la libreria OpenSSL, precisando che i requisiti della GPL non si applicano al collegamento con OpenSSL.
Rispetto al ramo OpenSSL 1.1.1, in OpenSSL 3.0.0 sono state aggiunte oltre 7500 modifiche, preparate da 350 sviluppatori. Le principali novità di OpenSSL 3.0.0:
- È stato proposto un nuovo modulo FIPS, che include l'implementazione di algoritmi crittografici conformi allo standard di sicurezza FIPS 140-2 (questo mese è prevista l'inizio del processo di certificazione del modulo, con il rilascio del certificato FIPS 140-2 atteso per l'anno prossimo). Il nuovo modulo è molto più facile da usare e la sua integrazione con molte applicazioni non sarà più complicata che modificare un file di configurazione. Per impostazione predefinita, il modulo FIPS è disattivato e richiede la specifica dell'opzione enable-fips per essere attivato.
- In libcrypto è stata implementata la concetto di provider pluggable, in sostituzione della concetto di motori (l'API ENGINE è stata dichiarata obsoleta). Con i provider è possibile aggiungere implementazioni personalizzate di algoritmi per operazioni come crittografia, decrittazione, generazione di chiavi, calcolo MAC, creazione e verifica di firme digitali. È possibile sia collegare nuovi provider che creare implementazioni alternative di algoritmi già supportati (per impostazione predefinita, ora è utilizzato il provider incorporato in OpenSSL per ogni algoritmo).
- È stato aggiunto il supporto per il protocollo di gestione dei certificati CMP (Certificate Management Protocol, RFC 4210), che può essere utilizzato per richiedere certificati da server un'autorità di certificazione, rinnovare certificati e revocare certificati. Il lavoro con CMP è facilitato da un nuovo strumento openssl-cmp, che include anche il supporto per il formato CRMF (RFC 4211) e l'invio delle richieste tramite HTTP/HTTPS (RFC 6712).
- È stato implementato un client completo per i protocolli HTTP e HTTPS, che supporta i metodi GET e POST, il reindirizzamento delle richieste, il funzionamento attraverso un proxy, la codifica ASN.1 e la gestione dei timeout.
- È stata aggiunta una nuova API EVP_MAC (Message Authentication Code API), che semplifica l'aggiunta di nuove implementazioni di MAC.
- È stata proposta una nuova interfaccia per la generazione di chiavi — EVP_KDF (Key Derivation Function API), che semplifica l'aggiunta di nuove implementazioni di KDF e PRF. La vecchia API EVP_PKEY, tramite la quale erano disponibili algoritmi come scrypt, TLS1 PRF e HKDF, è stata ristrutturata in forma di un'interfaccia di livello superiore, realizzata sopra le API EVP_KDF e EVP_MAC.
- Nell'implementazione del protocollo TLS è stata fornita la possibilità di utilizzare l'implementazione TLS incorporata nel kernel Linux sia per il client che per il server per accelerare le operazioni. Per abilitare l'implementazione TLS fornita dal kernel Linux è richiesta l'attivazione dell'opzione "SSL_OP_ENABLE_KTLS" o della configurazione "enable-ktls".
- È stato aggiunto il supporto per nuovi algoritmi:
- Algoritmi di derivazione delle chiavi (KDF) — «SINGLE STEP» e «SSH».
- Algoritmi di autenticazione dei messaggi (MAC) — «GMAC» e «KMAC».
- Algoritmo di incapsulamento delle chiavi RSA (KEM) «RSASVE».
- Algoritmo di crittografia «AES-SIV» (RFC-8452).
- Nell'API EVP sono state aggiunte chiamate con supporto per i crittografi inversi, che usano l'algoritmo AES per la crittografia delle chiavi (Key Wrap): «AES-128-WRAP-INV», «AES-192-WRAP-INV», «AES-256-WRAP-INV», «AES-128-WRAP-PAD-INV», «AES-192-WRAP-PAD-INV» e «AES-256-WRAP-PAD-INV».
- Nell'API EVP è stato aggiunto il supporto per algoritmi di prestito del testo cifrato (CTS): «AES-128-CBC-CTS», «AES-192-CBC-CTS», «AES-256-CBC-CTS», «CAMELLIA-128-CBC-CTS», «CAMELLIA-192-CBC-CTS» e «CAMELLIA-256-CBC-CTS».
- È stato aggiunto il supporto per le firme digitali CAdES-BES (RFC 5126).
- In AES_GCM è stato implementato il parametro AuthEnvelopedData (RFC 5083), che consente di crittografare e decrittografare messaggi autenticati e crittografati utilizzando la modalità AES GCM.
- Nell'API pubblica sono state spostate le funzioni PKCS7_get_octet_string e PKCS7_type_is_other.
- Nell'API PKCS#12, gli algoritmi utilizzati per impostazione predefinita nella funzione PKCS12_create() sono stati sostituiti da PBKDF2 e AES, mentre per il calcolo del MAC è stato utilizzato l'algoritmo SHA-256. Per ripristinare il comportamento precedente è prevista un'opzione «-legacy». Sono state aggiunte numerose nuove chiamate avanzate PKCS12_*_ex, PKCS5_*_ex e PKCS8_*_ex, come PKCS12_add_key_ex(), PKCS12_create_ex() e PKCS12_decrypt_skey_ex().
- Per la piattaforma Windows è stato aggiunto il supporto per la sincronizzazione dei thread tramite il meccanismo SRWLock.
- È stata aggiunta una nuova API per il tracciamento, attivabile tramite il parametro enable-trace.
- È stata ampliata la gamma di chiavi supportate nelle funzioni EVP_PKEY_public_check() e EVP_PKEY_param_check(): RSA, DSA, ED25519, X25519, ED448 e X448.
- È stata rimossa la sottosistema RAND_DRBG, sostituita dall'API EVP_RAND. Rimosse le funzioni FIPS_mode() e FIPS_mode_set().
- Una parte significativa dell'API è stata deprecata: l'uso di chiamate obsolete nel codice dei progetti genererà avvisi durante la compilazione. Tra queste, sono state ufficialmente dichiarate obsolete le API di basso livello legate a specifiche implementazioni di algoritmi (ad esempio, AES_set_encrypt_key e AES_encrypt). Il supporto ufficiale in OpenSSL 3.0.0 è ora fornito solo per le API di alto livello EVP, astratte dai singoli tipi di algoritmo (queste API includono, ad esempio, le funzioni EVP_EncryptInit_ex, EVP_EncryptUpdate e EVP_EncryptFinal). In una delle prossime versioni significative, le API obsolete saranno rimosse. Le implementazioni di algoritmi obsoleti, come MD2 e DES, disponibili tramite le API EVP, sono state spostate in un modulo separato 'legacy', disattivato di default.
- La documentazione e il set di test sono stati notevolmente ampliati. Rispetto al ramo 1.1.1, il volume della documentazione è aumentato del 94% e la dimensione del codice del set di test del 54%.
Fonte: opennet.ru
