Выпуск криптографической библиотеки OpenSSL 3.0.0

После трёх лет разработки и 19 тестовых выпусков состоялся релиз библиотеки OpenSSL 3.0.0 с реализацией протоколов SSL/TLS и различных алгоритмов шифрования. Новая ветка включает изменения, нарушающие обратную совместимость на уровне API и ABI, но изменения не повлияют на работу большинства приложений, для перевода которых с OpenSSL 1.1.1 достаточно пересборки. Поддержка прошлой ветки OpenSSL 1.1.1 будет осуществляться до сентября 2023 года.

Значительное изменение номера версии связано с переходом на
традиционную нумерацию “Major.Minor.Patch”. Первая цифра (Major) в номере версии отныне будет меняться только при нарушении совместимости на уровне API/ABI, а вторая (Minor) при наращивании функциональности без изменения API/ABI. Корректирующие обновления будут поставляться с изменением третьей цифры (Patch). Номер 3.0.0 сразу после 1.1.1 выбран для избежания пересечений с находящимся в разработке FIPS-модулем к OpenSSL, для которого применялась нумерация 2.x.

Вторым вадным для проекта изменением стал переход с двойной лицензии
(OpenSSL и SSLeay) на лицензию Apache 2.0. Ранее применявшаяся собственная лицензия OpenSSL была основана на тексте устаревшей лицензии Apache 1.0 и требовала явного упоминания OpenSSL в рекламных материалах при использовании библиотек OpenSSL, а также добавления специального примечания в случае поставки OpenSSL в составе продукта.
Подобные требования делали старую лицензию несовместимой с GPL, что создавало трудности при использовании OpenSSL в проектах с лицензией GPL. Для обхода данной несовместимости GPL-проекты вынуждены были применять специфичные лицензионные соглашения, в которых основной текст GPL дополнялся пунктом, явно разрешающим связывание приложения с библиотекой OpenSSL и упоминающим, что требования GPL не распространяется на связывание с OpenSSL.

По сравнению с веткой OpenSSL 1.1.1 в OpenSSL 3.0.0 добавлено более
7500 изменений, подготовленных 350 разработчиками. Основные новшества OpenSSL 3.0.0:

  • Предложен новый модуль FIPS, включающий реализацию криптографичкских алгоритмов, соответствующих стандарту безопасности FIPS 140-2 (в этом месяце планируется начать процесс сертификации модуля, получение сертификата FIPS 140-2 ожидается следующем году). Новый модуль значительно проще в использовании и его подключение ко многим приложениям будет не сложнее изменения файла конфигурации. По умолчанию модуль FIPS отключен и требует указания опции enable-fips для активации.
  • В libcrypto реализована концепция подключаемых провайдеров, пришедших на смену концепции движков (ENGINE API признан устаревшим). При помощи провайдеров можно добавлять собственные реализации алгоритмов для таких операций как шифрование, расшифровка, формирование ключей, вычисление MAC, создание и проверка цифровых подписей. Возможно как подключение новых, так и создание альтернативных реализаций уже поддерживаемых алгоритмов (по умолчанию для каждого алгоритма теперь используется встроенный в OpenSSL провайдер).
  • Добавлена поддержка протокола управления сертификатами CMP (Certificate Management Protocol, RFC 4210), который можно использовать для запроса сертификатов у сервера удостоверяющего центра , обновления сертификатов и отзыва сертификатов. Работа с CMP осуществляется при помощи новой утилиты openssl-cmp, в которой также реализована поддержка формата CRMF (RFC 4211) и передачи запросов через HTTP/HTTPS (RFC 6712).
  • Реализован полноценный клиент для протоколов HTTP и HTTPS, поддерживающий методы GET и POST, перенаправление запросов, работу через прокси, кодирование ASN.1 и обработку таймаутов.
  • Добавлен новый API EVP_MAC (Message Authentication Code API), упрощающий добавление новых реализаций имитовставок.
  • Предложен новый программный интерфейс для формирования ключей – EVP_KDF (Key Derivation Function API), упрощающий добавление новых реализаций KDF и PRF. Старый API EVP_PKEY, через который были доступны алгоритмы scrypt, TLS1 PRF и HKDF, переработан в форме прослойки, реализованной поверх API EVP_KDF и EVP_MAC.
  • В реализации протокола TLS предоставлена возможность использования встроенных в ядро Linux клиента и сервера TLS для ускорения операций.
    Для задействования предоставляемой ядром Linux реализации TLS требуется включение опции “SSL_OP_ENABLE_KTLS” или настройки “enable-ktls”.
  • Добавлена поддержка новых алгоритмов:
    • Алгоритмы формирования ключей (KDF) – “SINGLE STEP” и “SSH“.
    • Алгоритмы имитовставок (MAC) – “GMAC” и “KMAC“.
    • Алгоритм инкапсуляции ключей RSA (KEM) “RSASVE“.
    • Алгоритм шифрования “AES-SIV” (RFC-8452).
    • В API EVP добавлены вызовы с поддержкой инверсивных шифров, использующих алгоритм AES для шифрования ключей (Key Wrap): “AES-128-WRAP-INV”, “AES-192-WRAP-INV”, “AES-256-WRAP-INV”, “AES-128-WRAP-PAD-INV”, “AES-192-WRAP-PAD-INV” и “AES-256-WRAP-PAD-INV”.
    • В API EVP добавлена поддержка алгоритмов заимствование шифротекста (CTS): “AES-128-CBC-CTS”, “AES-192-CBC-CTS”, “AES-256-CBC-CTS”, “CAMELLIA-128-CBC-CTS”, “CAMELLIA-192-CBC-CTS” and “CAMELLIA-256-CBC-CTS”. CS1, CS2 и CS3.
    • Добавлена поддержка цифровых подписей CAdES-BES (RFC 5126).
    • В AES_GCM реализован параметр AuthEnvelopedData (RFC 5083), позволяющий зашифровать и расшифровывать сообщения, аутентифицированные и зашифрованные с использованием режима AES GCM.
  • В публичный API вынесены функции PKCS7_get_octet_string и PKCS7_type_is_other.
  • В API PKCS#12 алгортимы, применяемые по умолчанию в функции PKCS12_create(), заменены на PBKDF2 и AES, а для расчёта MAC задействован алгортим SHA-256. Для восстановления прошлого поведения предусмотрена опция “-legacy”. Добавлено большое число новых расширенных вызовов PKCS12_*_ex, PKCS5_*_ex и PKCS8_*_ex, таких как PKCS12_add_key_ex().PKCS12_create_ex() и PKCS12_decrypt_skey_ex().
  • Для платформы Windows добавлена поддержка синхронизации потоков при помощи механизма SRWLock.
  • Добавлен новый API для трассировки, включаемый через параметр enable-trace.
  • Расширен спектр ключей, поддерживаемых в функциях EVP_PKEY_public_check() и EVP_PKEY_param_check(): RSA, DSA, ED25519, X25519, ED448 и X448.
  • Удалена подсистема RAND_DRBG вместо которой предложен API EVP_RAND.
    Удалены функции FIPS_mode() и FIPS_mode_set()
  • Заметная часть API переведена в разряд устаревших – использование устаревших вызовов в коде проектов будет приводить в выводу предупреждения при компиляции. В том числе устареашими официально объявлены низкоуровневые API, привязанные с определённым реализациям алгоритмов (например, AES_set_encrypt_key и AES_encrypt). Официальная поддержка в OpenSSL 3.0.0 теперь предоставляется только для высокоуровневых API EVP, абстрагированных от отдельных типов алгоритмов (к данному API относятся, например, функции EVP_EncryptInit_ex, EVP_EncryptUpdate и EVP_EncryptFinal). В одном из следующих значительных выпусков устаревшие API будут удалены. Реализации многих устаревших алгортмов, таких как MD2 и DES, доступных через API EVP, перенесены в отдельный модуль “legacy”, который отключён по умолчанию.
  • Значительно расширены документация и набор текстов. По сравнению с веткой 1.1.1 бъём документации увеличился на 94%, а размер кода текстового набора на 54%.
Release. Ссылка here.