четверг, 12 июля 2012 г.

openssl, ГОСТ (gost) и мои кривые руки

Сразу забегая вперед расскажу, что с грехом пополам настроил...


Решил я проверить, а как будет работать nginx с шифрацией по ГОСТу.

Открываем http://www.cryptocom.ru/docs/cryptopacket-libssl.pdf и смотрим

Для алгоритмов ГОСТ существуют четыре шифрсьюта GOST2001-GOST89-GOST89;
GOST2001-NULL-GOST94; GOST94-GOST89-GOST89; GOST94-NULL-GOST94.
После 31 декабря 2007 года шифрсьюты GOST94-GOST89-GOST89 и GOST94-NULLGOST94 использоваться не должны.


Ну ладно. Качаем 3(!) дистрибьютива openssl в каждом из которых заявлена поддержка ГОСТа
1) openssl 0.9.8x -- сам ошибся -- он не поддерживает ГОСТ. Поддержка началась только с 1.0.0, до этого были неофициальные патчи от КриптоКом.
2) openssl 1.0.1с
http://slproweb.com/download/Win32OpenSSL-1_0_1c.exe 18 405 907
3) openssl 0.9.8e МагПро
http://www.cryptocom.ru/binary/MagPro_CryptoPack/Windows/cryptopack-trial.exe  1 751 049


А теперь протестируем поддержку ГОСТа:

C:\openssl\bin>openssl.exe ciphers

И что мы видем?

openssl 0.9.8e МагПро

DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-
SHA:AES128-SHA:IDEA-CBC-SHA:IDEA-CBC-MD5:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:RC4-64-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5
:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5

openssl 1.0.1с


ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA
:SRP-DSS-AES-256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RS
A-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:ECDH-RSA-AES256-GCM-SHA384:ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256
-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:CAMELLIA256-SHA:PSK-AES256-CBC-SH
A:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:SRP-DSS-3DES-EDE-CBC-SHA:SRP-RSA-3DES-EDE-CBC-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ECDH-RSA-
DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA:PSK-3DES-EDE-CBC-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA25
6:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:SRP-DSS-AES-128-CBC-SHA:SRP-RSA-AES-128-CBC-SHA:DHE-DSS-AES128-GCM-SHA256:DHE-R
SA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:DHE-RSA-SEED-SHA:DHE-DSS-SEED-SHA:DHE-RSA-CAMELL
IA128-SHA:DHE-DSS-CAMELLIA128-SHA:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-SHA256:ECDH-ECDSA-AES128-SHA256:ECDH-RSA-AES1
28-SHA:ECDH-ECDSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:SEED-SHA:CAMELLIA128-SHA:IDEA-CBC-SHA:PSK-AES128-CBC-SHA:ECDHE-RSA-RC4-SHA:ECDH
E-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:RC4-SHA:RC4-MD5:PSK-RC4-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:EXP-EDH-RSA-DES-CBC
-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC4-MD5

Вот и верь после этого людям :(

Продолжение №2


Запускаю на тестовой машине (виртуальная машина под VirtualBox Windows XP SP2) и что же я вижу:

GOST2001-GOST89-GOST89:GOST94-GOST89-GOST89:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-D
ES-CBC3-SHA:DES-CBC3-SHA:DES-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:IDEA-CBC-SHA:IDEA-CBC-MD5:RC2-CBC-MD
5:RC4-SHA:RC4-MD5:RC4-MD5:RC4-64-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SH
A:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5


Ok. ГОСТ есть на тестовой машине под openssl 0.9.8e МагПро, а тот же openssl 0.9.8e МагПро на Windows7 не предложил ГОСТы?
Будем разбираться...

Продолжение №3

Смотрим в ENV (команда set в командпромпте)
WinXP -- все тихо
Win7 -- есть странная переменная
OPENSSL_CONF=C:\OpenSSL\bin\openssl.cfg
обратите внимание на расширение!


openssl 0.9.8e МагПро высасывает конфигурацию по умолчанию из файла openssl.cnf
который должен лежать в директории c:\openssl\, а не c:\openssl\bin\


Вот в этом то собака и порылась!!!
Причиной тому послужило попеременная установка импортного openssl 1.0.1c и отечественного МагПро.
Будьте внимательно, что и куда суют инсталляторы!


Для того чтобы openssl 0.9.8e МагПро показал ГОСТы нужно чтобы было в конфиге

[ openssl_def ]
engines = engine_section
[ engine_section ]
gost=gost_section
[gost_section]
default_algorithms=ALL
engine_id=gost

после чего наблюдаем родные ГОСТы:

GOST2001-GOST89-GOST89:GOST94-GOST89-GOST89:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:DES
-CBC3-MD5:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:AES128-SHA:IDEA-CBC-SHA:IDEA-CBC-MD5:RC2-CBC-MD5:RC4-SHA:RC4-MD5:RC4-MD5:RC4-64-MD5:EDH-RSA-DES-CBC-SHA
:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD
5:EXP-RC4-MD5


Теперь начинаем приучать openssl 1.0.1с к ГОСТу.

и далее по тексту

Вставляем в начале
openssl_conf = openssl_def

и вставляем в конце (тоже самое, что и было в 0.9.8e)
[ openssl_def ]
engines = engine_section
[ engine_section ]
gost=gost_section
[gost_section]
default_algorithms=ALL
engine_id=gost

и получаем ошибку
C:\OpenSSL\bin>openssl.exe ciphers > ciphers4
Error configuring OpenSSL
4020:error:25078067:DSO support routines:WIN32_LOAD:could not load the shared library:.\crypto\dso\dso_win32.c:180:filename(\usr\local\ssl\lib\engines\
gost.dll)
4020:error:25070067:DSO support routines:DSO_load:could not load the shared library:.\crypto\dso\dso_lib.c:244:
4020:error:260B6084:engine routines:DYNAMIC_LOAD:dso not found:.\crypto\engine\eng_dyn.c:450:
4020:error:2606A074:engine routines:ENGINE_by_id:no such engine:.\crypto\engine\eng_list.c:417:id=gost
4020:error:260BC066:engine routines:INT_ENGINE_CONFIGURE:engine configuration error:.\crypto\engine\eng_cnf.c:204:section=gost_section, name=default_al
gorithms, value=ALL
4020:error:0E07606D:configuration file routines:MODULE_RUN:module initialization error:.\crypto\conf\conf_mod.c:235:module=engines, value=engine_sectio
n, retcode=-1

После чего кладем C:\OpenSSL\bin\gost.dll  в директорию C:\OpenSSL\lib\engines\ (директорию еще нужно создать)
И получаем то же самое, только сбоку!!!

Внимательно читаем и видим, что нужно добавить еще две строки
[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
default_algorithms = ALL
dynamic_path = /usr/local/lib/engines/libgost.so
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

И получаем то же самое, только сбоку!!!
После получаса борьбы выяснилось, что если поставить dynamic_path выше на одну строчку (редкостный БРЕД!!!!!!!!!!!!!!!!!), то все заработает.

[gost_section]
engine_id=gost
dynamic_path = C:/OpenSSL/lib/engines/gost.dll 
default_algorithms=ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet



C:\OpenSSL\bin>openssl.exe ciphers
ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA
:SRP-DSS-AES-256-CBC-SHA:SRP-RSA-AES-256-CBC-SHA:DHE-DSS-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA256:DHE-RS
A-AES256-SHA:DHE-DSS-AES256-SHA:DHE-RSA-CAMELLIA256-SHA:DHE-DSS-CAMELLIA256-SHA:GOST2001-GOST89-GOST89:GOST94-GOST89-GOST89:ECDH-RSA-AES256-GCM-SHA384:
ECDH-ECDSA-AES256-GCM-SHA384:ECDH-RSA-AES256-SHA384:ECDH-ECDSA-AES256-SHA384:ECDH-RSA-AES256-SHA:ECDH-ECDSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:
AES256-SHA:CAMELLIA256-SHA:PSK-AES256-CBC-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:SRP-DSS-3DES-EDE-CBC-SHA:SRP-RSA-3DES-EDE-CBC-SHA:EDH-RSA
-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:ECDH-RSA-DES-CBC3-SHA:ECDH-ECDSA-DES-CBC3-SHA:DES-CBC3-SHA:PSK-3DES-EDE-CBC-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-EC
DSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:SRP-DSS-AES-128-CBC-SHA:SRP-RSA-AES
-128-CBC-SHA:DHE-DSS-AES128-GCM-SHA256:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES128-SHA256:DHE-DSS-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA:DHE-
RSA-SEED-SHA:DHE-DSS-SEED-SHA:DHE-RSA-CAMELLIA128-SHA:DHE-DSS-CAMELLIA128-SHA:ECDH-RSA-AES128-GCM-SHA256:ECDH-ECDSA-AES128-GCM-SHA256:ECDH-RSA-AES128-S
HA256:ECDH-ECDSA-AES128-SHA256:ECDH-RSA-AES128-SHA:ECDH-ECDSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:SEED-SHA:CAMELLIA128-SHA:IDEA-CBC-S
HA:PSK-AES128-CBC-SHA:ECDHE-RSA-RC4-SHA:ECDHE-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:RC4-SHA:RC4-MD5:PSK-RC4-SHA:EDH-RSA-DES-CBC-SHA:EDH-DSS
-DES-CBC-SHA:DES-CBC-SHA:EXP-EDH-RSA-DES-CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC4-MD5

3 комментария:

  1. Здравствуй. Подскажи.
    Нужно на компьютере сделать тестовый гостовый сертификат.
    Но гост, как и у тебя не получается настроить.

    Пишу: ciphers > ciphers4
    Ответ openssl: Error configuring OpenSSL
    error in ciphers

    Почту могу в личку кинуть или куда?!

    ОтветитьУдалить
  2. Можно и в личку ali47802 gmail com

    Для начала смотрим set, куда смотрим переменная PATH (где лежат DLL -- очень часто проблема в том, что "видимость" перекрывают dll с тем же названием но другой версии. рекомендую "перекрыть видимость" текущей директорией set PATH=.;%PATH% и сложить в текущую директорию нужные либы.

    По классике DLL _должна_ искаться сначала в текущей директории, а уже потом в %PATH%, но практика показала обратное :(

    и смотрим переменную OPENSSL_CONF=C:\OpenSSL\bin\openssl.cfg

    А затем смотрим сам конфиг.

    Примеры конфигов прилагались в сообщениях -- нужно править последние строчки.

    По результатам жду письмо

    ОтветитьУдалить
  3. Мне помогли двойные слэши:

    #
    # OpenSSL example configuration file.
    # This is mostly being used for generation of certificate requests.
    #
    openssl_conf = openssl_def

    # This definition stops the following lines choking if HOME isn't
    # defined.
    HOME = .
    RANDFILE = $ENV::HOME/.rnd

    # Extra OBJECT IDENTIFIER info:
    #oid_file = $ENV::HOME/.oid

    [openssl_def]
    engines = engine_section
    oid_section = new_oids

    <...>

    [engine_section]

    gost = gost_section

    [gost_section]
    engine_id = gost
    dynamic_path = C:\\openssl\\bin\\gost.dll
    default_algorithms = ALL
    CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

    ОтветитьУдалить