OpenSSL сейчас является стандартом де-факто в области
криптографии и используется повсеместно.
Во всех Linux,
FreeBSD и Meego– при помощи библиотеки OpenSsl осуществляется
все, что касается SSL соединений. В Mac OS X до 10.6 OpenSsl являлся
единственным провайдером криптографических функций для SSL, а начиная с 10.7, появился новый
провайдер, который, вероятно, использует только Apple. OpenSsl продолжает
оставаться в MacOS X. В Symbian OpenSsl присутствует
во всех современных телефонах, однако, присутствует также и свой старый API для
Symbian для поддержки старых приложений.
В процессе работы над клиентской и серверной частями сервиса
cryptia.com было
обнаружено, что в большинстве имеющихся на рынке unix based OS, собранный по умолчанию OpenSSL имеет
умышленно вставленное ограничение на использование DSA ключей с
длиной более 1024 бит.
Это обнаружено нами во ВСЕХ !!! имеющихся на рынке MacOS X, до
10.7.4. включительно, во всех Meego,
в Symbian OS,
во всех Android.
FreeBSD по умолчанию ставится тоже с пробитым OpenSSL, однако в портах лежит версия с
официального сайта. Касательно репозитариев Linux: бывает по разному, но в большинстве дистрибутивов лежит версия с
ослабленной защитой. В случае с сервисом Cryptia.com это проявляется в том, что клиентские сертификаты
подписанные сервером (ключом DSA
2048 бит) не проходят верификацию в клиенте. Функция API EVP_VerifyFinal
и EVP_SignFinal возвращает код ошибки («подпись не верна»).
У Вас на компьютере может стоять нормальный OpenSSL, однако при очередном
обновлении OS из репозитария, в операционную систему, скорее всего, будет
установлен «правильный» OpenSSL и все программы начнут
использовать его.
Как с этим бороться? «Таблетка».
Качать исходник OpenSSL с официального сайта openssl.org, который хостится в Германии и
собирать его самому. Инструкция по сборке зависит от платформы, и для Desktop версии,
как правило, не является проблемой. Проблемой
является избавиться в программе от зависимости Qt от OpenSsl в системе.
Замечания по грамотному использованию «Таблетки».
Qt библиотеки (OpenSSL использует только QtNetwork), как правило собираются с поддержкой динамической
загрузки OpenSSL, хотя можно собрать и со статической линковкой OpenSSL.
Проблема в том, что в большинстве Linux дистрибутивов
как-то собранные библиотеки Qt уже стоят (на Qt написана KDE). Также Qt уже
установлена в последних телефонах с Symbian и Meego. Требовать от пользователя поставить свой Qt или обновить его
автоматически в программе установки дело очень рискованное – у пользователя
могут «поломаться» уже установленные и работающие программы.
Почти во всех OS невозможно подгрузить в адресное
пространство процесса две библиотеки с одинаковыми именами и одинаковым набором
экспортируемых функций.
Если вы используете свою динамически загружаемую библиотеку OpenSsl, случайное обращение
к QSslCertificates
(Например, для того чтобы получить список корневых сертификатов встроенных в OS) приведет к тому что QtNetwork, попытается
загрузить библиотеку OpenSsl,
как правило из OS, а не
вашу, потому что о вашей QtNetwork ничего не знает.
Вариант со статической линковкой своего Qt и openSsl в программе, нравится не очень по
следующим причинам:
- Как правило библиотеки Qt, по крайней мере в Linux, Symbian и Meego уже загружены каким-нибудь процессом в память и второй раз не загружаются, а вместо этого только выставляется отображение RO сегментов на память процесса и инициализация RW сегментов. Если статически слинковать весь Qt в программу, то программа «опухает» примерно на 10-15 MB, и запускается существенно дольше.
- В мобильных платформах ориентированных на Qt (Symbian, Meego (возможно BB10) ), тяжело пересобирать Qt статически.
По этой причине в клиентской программе Cryptia мы
отказались от использования встроенной в Qt поддержки openssl. Для этого надо отказаться от
использования всех классов начинающихся с QSsl (QSslSocket,
QSslCertificate …). Все
эти классы заменены своими. Для того чтобы случайно не «просочилось» где-нибудь
в кусках старого кода использование этих классов, мы пересобрали у себя Qt c отключенной
поддержкой OpenSsl. В
этом случае компилятор будет ругаться при попытке использования в программе
классов с QSsl… В своих классах мы используем вызовы своего OpenSSL, который статически
линкуем к программе.
Таким образом, программа получается независимой от варианта
сборки Qt, который она
использует, а также от того, какой OpenSsl установлен у пользователя с одной
стороны, а с другой – Qt все-таки динамически линкуется с программой и программа
быстрее стартует на десктоп-платформах и просто работает на мобильных.
Спасибо!
ОтветитьУдалитьУдачи вам Cryptia!
ОтветитьУдалить