Jump to content
Калькуляторы

Сборка OpenSSL с поддержкой ГОСТ 2012

Не поделитесь инструкцией по сабжу?

Исходники OpenSSL беру отсюда, версия 1.1.1c.

engine беру отсюда (пакет cprocsp-cpopenssl-~11315-5.x86_64.rpm, в нем есть библиотека libgost.so, а это вроде бы именно то, что нужно).

 

Собираю так: ./config no-shared zlib --prefix=/opt/gostssl

Собирается успешно, OpenSSL запускается и показывает, что поддержка engine есть:

# openssl engine
(dynamic) Dynamic engine loading support

Но как только я пытаюсь подключить engine:

openssl_conf = openssl_def

[openssl_def]
engines = engine_section

[engine_section]
gostengy = gost_section

[gost_section]
engine_id = gostengy
dynamic_path = /opt/gostssl/lib/engines-1.1/libgost.so
default_algorithms = CIPHERS, DIGESTS, PKEY, PKEY_CRYPTO, PKEY_ASN1

то при запуске OpenSSL тут же получаю сообщение, что он не может загрузить so, возможно как раз потому, что я собирал OpenSSL со статической линковкой (без shared libs).

 

Но если я собираю OpenSSL так: ./config shared zlib --prefix=/opt/gostssl

то он собирается, но при запуске пишет, что error while loading shared libraries: libssl.so.1.1.

Эта библиотека в /opt/gostssl/lib/ (как она сама, так и симлинк libssl.so), но видимо OpenSSL пытается искать ее где-то в другом месте, скорее всего в общесистемном.

# ldd openssl 
        linux-vdso.so.1 =>  (0x00007fff43fff000)
        libssl.so.1.1 => not found
        libcrypto.so.1.1 => not found
        libz.so.1 => /lib64/libz.so.1 (0x00007fa234b42000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fa23493e000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa234720000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fa23438c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa234d61000)

Видимо путь нужно указывать где-то дополнительно.

На первый взгляд это похоже на баг, хотя и для бага указано, что он уже закрыт.

 

Кстати, по ссылке был предложен костыль, в виде добавления пути /opt/gostssl/lib в файле ld.so.conf.

Это помогло, теперь новая сборка OpenSSL запускается, но engine все равно не загружается:

# ./openssl engine
(dynamic) Dynamic engine loading support
140729665955584:error:25066067:DSO support routines:dlfcn_load:could not load the shared library:crypto/dso/dso_dlfcn.c:119:filename(/opt/gostssl/lib/engines-1.1/libgost.so): libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
140729665955584:error:25070067:DSO support routines:DSO_load:could not load the shared library:crypto/dso/dso_lib.c:162:
140729665955584:error:260B6084:engine routines:dynamic_load:dso not found:crypto/engine/eng_dyn.c:414:
140729665955584:error:260BC066:engine routines:int_engine_configure:engine configuration error:crypto/engine/eng_cnf.c:141:section=gost_section, name=dynamic_path, value=/opt/gostssl/lib/engines-1.1/libgost.so
140729665955584:error:0E07606D:configuration file routines:module_run:module initialization error:crypto/conf/conf_mod.c:177:module=engines, value=engine_section, retcode=-1 

 

Share this post


Link to post
Share on other sites

Кстати, в пакете cprocsp-cpopenssl-110-64-5.0.11315-5.x86_64.rpm лежит не просто engine, а целиком сборка OpenSSL.

Она даже запускается сразу.

Вот только:

# ./openssl ciphers | tr ":" "\n" | grep -i gost
GOST2001-GOST89-GOST89
GOST94-GOST89-GOST89

# ./openssl engine
(dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine

То ли я что-то не так сделал, то ли на самом деле там не полноценная библиотека, а заглушка.

Share this post


Link to post
Share on other sites

попадался пакет с поддержкой ГОСТа готовый, гуглите в Яндексе,  ну и на хабре подробная инструкция по сборке.

Share this post


Link to post
Share on other sites

Не выходит что-то каменный цветок.

По ссылке выше на форум КриптоПро беру два дистрибутива:

cprocsp-cpopenssl-110-64-5.0.11315-5.x86_64.rpm — сборка OpenSSL

cprocsp-cpopenssl-110-gost-64-5.0.11315-5.x86_64.rpm — поддержка ГОСТ

Установочные скрипты в обоих пакетах максимально простые — в первом пакете помимо копирования обновляется файл ld.so.conf, а во втором также обновляется файл ld.so.conf плюс обновляется конфигурационный файл openssl.cnf.

В итоге конфигурационный файл получается такой:

HOME                    = .
oid_section             = new_oids

openssl_conf = openssl_def

[openssl_def]
engines = engine_section

[engine_section]
gostengy = gost_section

[gost_section]
engine_id = gostengy
dynamic_path = /opt/cprocsp/cp-openssl-1.1.0/lib/amd64/engines/libgostengy.so
default_algorithms = CIPHERS, DIGESTS, PKEY, PKEY_CRYPTO, PKEY_ASN1

Но при запуске выдает то же самое:

# ./openssl engine
(dynamic) Dynamic engine loading support
139803887970048:error:25066067:DSO support routines:dlfcn_load:could not load the shared library:crypto/dso/dso_dlfcn.c:113:filename(/opt/cprocsp/cp-openssl-1.1.0/lib/amd64/engines/libgostengy.so): libcapi20.so.4: cannot open shared object file: No such file or directory
139803887970048:error:25070067:DSO support routines:DSO_load:could not load the shared library:crypto/dso/dso_lib.c:161:
139803887970048:error:260B6084:engine routines:dynamic_load:dso not found:crypto/engine/eng_dyn.c:414:
139803887970048:error:260BC066:engine routines:int_engine_configure:engine configuration error:crypto/engine/eng_cnf.c:141:section=gost_section, name=dynamic_path, value=/opt/cprocsp/cp-openssl-1.1.0/lib/amd64/engines/libgostengy.so
139803887970048:error:0E07606D:configuration file routines:module_run:module initialization error:crypto/conf/conf_mod.c:173:module=engines, value=engine_section, retcode=-1  

Все ссылки, которые я находил, в конечном итоге основывались на этой теме: https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=8544

Share this post


Link to post
Share on other sites
37 минут назад, alibek сказал:

libcapi20.so.4: cannot open shared object file: No such file or directory

разве не оно?

 

вроде по этой статье делал:

https://www.easycoding.org/2018/11/28/dobavlyaem-podderzhku-gost-dlya-openssl-v-fedora.html

 

в добавок:

https://github.com/gost-engine/rpm

Edited by NewUse
дополнил

Share this post


Link to post
Share on other sites

gost-engine я находил.

Но не могу собрать, нужен cmake третьей версии, а на CentOS 6 он второй версии.

Я даже rpm находил, но и он требовал glibc версии 2.18, а в репозитории у меня версия младше.

Обновлять подобные пакеты вручную потом боком выйдет, а обновить ядро/ОС не могу, потому что на этом сервере работает СКАТ и менять версию ядра нельзя.

Share this post


Link to post
Share on other sites

Скат, ну удачи...(сорри за офтоп)

зачем Вам 1.1?

у меня под центос 6 как раз 101е с гостом, пакет лежит на сайте криптопро...

ну и в чём проблема собрать из сорцов, гост давно в них?

 

Edited by NewUse

Share this post


Link to post
Share on other sites

СКАТ я и не трогаю, просто у меня скрипт, забирающий дампы, работает на том же сервере, что и СКАТ.

Вроде бы нашел способ, как поставить glibc 2.14 в отдельный каталог, не заменяя системные библиотеки.

 

Аллилуйя!

# ./openssl engine
(dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine

# ./openssl ciphers | tr ":" "\n" | grep -i gost
GOST2012-GOST8912-GOST8912
GOST2001-GOST89-GOST89

 

Share this post


Link to post
Share on other sites

Рано радовался.

Конвертировать PFX в PEM не хочет, жалуется на неподдерживаемые атрибуты.

Вроде бы где-то на форуме CryptoPro я читал, что в библиотеке gostengy не реализована генерация ключа, может быть в этом дело.

 

Вообщем я воспользовался предыдущим советом и поставил на виртуальную Ubuntu 14 утилиту get-cpcert.

Утилитой преобразовал ключ в PEM, а уже полученный PEM просто скопировал на сервер, где собран OpenSSL с поддержкой ГОСТ 2012, и уже он спокойно все подписал.

Так что сейчас все работает и до следующего года можно спать спокойно.

 

Посмотрел я, что делает скрипт prepare.sh.

В принципе ничего сверхъестественного, можно было бы и вручную повторить.

Но боюсь, что на CentOS 6 этого не повторить, системные библиотеки слишком старые, а обновлять их нельзя.

 

Запишу на всякий случай, если нужно будет вернуться через год.

1. Собираем из исходников OpenSSL версии не ниже 1.1.1, с поддержкой engine. Добавляем ГОСТовский engine, брать с форума CryptoPro.

2. В принципе можно не собирать OpenSSL, а взять готовую бинарную сборку тут: https://update.cryptopro.ru/support/nginx-gost/bin/185515/ (в пакете 110-64 лежит сам OpenSSL, в пакете 110-gost-64 лежит engine).

3. Ставим скрипт get-cpcert, берем отсюда: https://github.com/kov-serg/get-cpcert

4. Экспортируем ЭЦП в формате CryptoPro на флешку (получится каталог вида folder.000, внутри которого лежат части ключа).

5. Этот каталог скармливаем скрипту get-cpcert и получаем ключ в формате PEM.

6. А уже с этим PEM нормально работает обычный OpenSSL.

7. А чтобы не словить крайне странные глюки, то бинарный файл openssl переименовываем в openssl.real, а вместо него создает враппер с таким содержимым:

#!/bin/sh

EXE=$(readlink -f "$0")
DIR=$(dirname "$EXE")
export LD_LIBRARY_PATH=/srv/erdi/gostssl/lib:/opt/glibc-2.14/lib
exec $DIR/openssl.real $*

А то если в систему подсунуть glibc-2.14, то там начинается нечто феерическое.

У меня сходу слетел часовой пояс (точнее он перестал читаться), перестал работать yum и сломались утилиты, использующие сокеты.

Share this post


Link to post
Share on other sites

Э...

Тут дело не в моих предпочтениях.

СКАТ работает именно на этой версии. И кроме СКАТ на этом сервере ничего нет и не планируется, поэтому и резона никакого нет менять/обновлять ОС.

Забирать и подписывать выгрузки РКН — это всякая попутная мелочь, которую логично запускать на сервере со СКАТом — ресурсов она практически не потребляет, зато все в одном месте.

Share this post


Link to post
Share on other sites
3 часа назад, alibek сказал:

Забирать и подписывать выгрузки РКН — это всякая попутная мелочь, которую логично запускать на сервере со СКАТом — ресурсов она практически не потребляет, зато все в одном месте.

Нет, нелогично. Ось старая, ядро со всеми накопленными дырами. Нафига на потенциальные неприятности напрашиваться?

Share this post


Link to post
Share on other sites

Какие? СКАТ подключен в разрыв, он прозрачен и невидим на L2. У него вообще нет абонентских или каких других сервисов.

Share this post


Link to post
Share on other sites
3 часа назад, alibek сказал:

Какие? СКАТ подключен в разрыв, он прозрачен и невидим на L2. У него вообще нет абонентских или каких других сервисов.

Те секса со сборкой опенссл вам показалось мало?)

Посыл в том, что платформа не поддерживаемая, и сегодня у вас опенссл не собирается, завтра что то ещё.

Тут либо всё переносить на актуальную версию либо вообще внутрь не лазить и делать подпорки на внешних серверах.

Share this post


Link to post
Share on other sites

Трафик в СКАТ идёт с DNA интерфейсов через ZC драйвер полностью минуя систему.

А хотелки прикрутить сбоку ещё что то, то тут уже - секас, причем, по моему, лишний в рамках СКАТа.

Сорри за офтоп.

Share this post


Link to post
Share on other sites
8 часов назад, alibek сказал:

и невидим на L2.

Ага. А к источникам обновлений и, в вашем случае, выгрузкам он через подпространственный туннель телепатирует?

Share this post


Link to post
Share on other sites
5 часов назад, Ivan_83 сказал:

Тут либо всё переносить на актуальную версию либо вообще внутрь не лазить и делать подпорки на внешних серверах

В этом смысле да, знал бы заранее, может быть и не стал бы лезть. Но все же получилось, на год хватит, а что через год будет, ещё неизвестно.

 

13 минут назад, snvoronkov сказал:

А к источникам обновлений и, в вашем случае, выгрузкам он через подпространственный туннель телепатирует?

Это все же не абонентские сервисы, доступные извне. Это mgmt-интерфейс для управления, он может быть упрятан за NAT или прокси, входящие подключения на нем не нужны.

Рабочие интерфейсы DNA и они прозрачны.

Share this post


Link to post
Share on other sites
1 час назад, alibek сказал:

Это mgmt-интерфейс для управления, он может быть упрятан за NAT или прокси

При некоторых ошибках ядра можно ронять сервер ACK пакетом...

Share this post


Link to post
Share on other sites
В 14.06.2019 в 14:55, alibek сказал:

 

4. Экспортируем ЭЦП в формате CryptoPro на флешку (получится каталог вида folder.000, внутри которого лежат части ключа).

 

Это с помощью CSP экспорт делается или покупали новую P12fromCSP? Флешка имеется в виду обычная или рутокен?

Share this post


Link to post
Share on other sites

С помощью CSP. Флешка обычная (не токен).

Старая версия P12fromCSP новые ключи не поддерживает (вылетает при экспорте).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this