Интересные всё-таки люди писали в Ruby модуль OpenSSL.
Они не поленились написать биндинги практически ко всему API (чего по-моему нет ни в одном другом скриптовом языке), в том числе и к API engines, но совершенно забили на документирование всего этого безобразия. Во всяком случае http://www.ruby-doc.org на тему криптографических модулей молчит как рыба об лед. Только список файлов и классов показывает.
Ну ладно, я всё-таки в нижележащем API кое-чего понимаю. Беглым рассматриванием исходника обнаружиаю, что нужный мне метод называется OpenSSL::Engine::by_id. Вписываю в тестовый скрипт OpenSSL::Engine::by_id("gost"), а оно мне и говорит
"нету такой engine". Как нету? Я ж сам libgost.so туда клал (туда - это где openssl её искатб будет). Ставлю LD_LIBRARY_PATH на место, где лежит libcrypto.so с отладочной информацией, лезу в отладчик. Всё честно - вызываем
Ключевая фраза
Дальше, надеюсь, все пойдет как по рельсям. Правда, нужно разобраться есть ли у них generic объект для секретных ключей.
А то во всех примерах Key::RSA::new. А мне RSA не нужен. А писать Key::GOST, естественно, лень. Не царское это дело (не скриптовое в смысле), думать о том какой алгоритм с открытым ключом используется при работе. Есть ключ, в нем OID написан, нехай нижележащая библииотека разбирается.
Они не поленились написать биндинги практически ко всему API (чего по-моему нет ни в одном другом скриптовом языке), в том числе и к API engines, но совершенно забили на документирование всего этого безобразия. Во всяком случае http://www.ruby-doc.org на тему криптографических модулей молчит как рыба об лед. Только список файлов и классов показывает.
Ну ладно, я всё-таки в нижележащем API кое-чего понимаю. Беглым рассматриванием исходника обнаружиаю, что нужный мне метод называется OpenSSL::Engine::by_id. Вписываю в тестовый скрипт OpenSSL::Engine::by_id("gost"), а оно мне и говорит
"нету такой engine". Как нету? Я ж сам libgost.so туда клал (туда - это где openssl её искатб будет). Ставлю LD_LIBRARY_PATH на место, где лежит libcrypto.so с отладочной информацией, лезу в отладчик. Всё честно - вызываем
ENGINE_by_id
с правильным ID, оно не находит в списке загруженных, и пытается инициализировать engine dynamic, чтобы динамически подгрузить то, что просили. И тут-то его настигает облом. Нету engine dynamic. Как нету? Я ж сам видел в исходниках ENGINE_load_builtin_engines
? Лезу в код, смотрю, и вижу что где-то между версией 1.8.2 которая не собирается с OpenSSL 0.9.8 (даже и нормальным, непатченным), и 1.8.5 этот вызов закоментарили. Злые они. Раскоментарил, пересобрал, сертификат читается и подпись под сообщением проверяется.Ключевая фраза
engine = Engine::by_id("gost")
Дальше, надеюсь, все пойдет как по рельсям. Правда, нужно разобраться есть ли у них generic объект для секретных ключей.
А то во всех примерах Key::RSA::new. А мне RSA не нужен. А писать Key::GOST, естественно, лень. Не царское это дело (не скриптовое в смысле), думать о том какой алгоритм с открытым ключом используется при работе. Есть ключ, в нем OID написан, нехай нижележащая библииотека разбирается.