Использование OpenSSL в режиме FIPS с .NET

Я создал контейнер OpenSSL FIPS версии 2.0.1, а затем с помощью этого контейнера собрал OpenSSL 1.0.1c (в соответствии с инструкциями в Руководстве пользователя для объектного модуля OpenSSL FIPS версии 2.0):

SET FIPSDIR=C:\OpenSSL\FIPS

cd C:\OpenSSL\openssl-fips-2.0.1
ms\do_fips

cd C:\OpenSSL\openssl-1.0.1c
ms\do_nasm
nmake -f ms\ntdll.mak

У меня есть эти импорты в моем приложении .NET (которое, очевидно, использует libeay32.dll сверху):

[DllImport("libeay32", CallingConvention = CallingConvention.Cdecl)]
public extern static void ERR_load_crypto_strings();

[DllImport("libeay32", CallingConvention = CallingConvention.Cdecl)]
public extern static int ERR_print_errors_fp(SafeHandle file);

[DllImport("libeay32", CallingConvention = CallingConvention.Cdecl)]
public extern static int FIPS_mode_set(int onoff);

Проблема в том, что когда я вызываю FIPS_mode_set(1), он возвращает 0, что указывает на то, что режим FIPS не может быть включен.

Чтобы попытаться выяснить, в чем проблема, я делаю следующее:

ERR_load_crypto_strings();

using (FileStream fs = new FileStream...)
{
  ERR_print_errors_fp(fs.SafeFileHandle);
}

Что дает мне это сообщение об ошибке:

OPENSSL_Uplink(0FAF1000,08): no OPENSSL_Applink

Я пытался найти ответы, но ничего не нашел - буду очень признателен за любые предложения!

** ОБНОВЛЕНИЕ **

Я попытался создать его, используя те же шаги из командной строки Visual Studio 2008 вместо командной строки Visual Studio 2010 (которую я использовал ранее) — и это сработало!

Но я понятия не имею, почему он не будет работать с Visual Studio 2010, и я не хочу, чтобы Visual Studio 2008 висела вечно — есть идеи, как я могу заставить его нормально работать с Visual Studio 2010?


person Cocowalla    schedule 01.09.2012    source источник
comment
Возможно, это может помочь: openssl.org/docs/crypto/OPENSSL_Applink.html   -  person alk    schedule 08.09.2012
comment
@alk Нет - Питер уже разместил ссылку на это, и я в любом случае видел это раньше. Как я уже упоминал в своем ответе Питеру, я не подключаю библиотеку OpenSSL к своему коду — я использую ее с .NET через pinvoke.   -  person Cocowalla    schedule 09.09.2012
comment
Что касается ошибки OPENSSL_Applink, я тоже столкнулся с ней при написании собственной DLL для вызова libeay32. Проблема возникает из-за смешения C и C++. Если вы используете подпрограммы BIO для файлового ввода-вывода, а затем вызываете их ИЗ С++ (и все файловые операции ввода-вывода происходят в C), проблема должна исчезнуть. Я получил подсказку из этого комментария: как сгенерировать подпись rsa sha с помощью openssl в c%23comment40172578_24075424"> stackoverflow.com/questions/24066318/   -  person Timothy John Laird    schedule 28.12.2017


Ответы (3)


Я тщетно искал полные инструкции о том, как создать исполняемый файл с поддержкой OpenSSL FIPS, и нашел только разочарование и тупики. Наконец, после многочисленных проб и ошибок я обнаружил, что следующее работает без каких-либо ошибок сборки. Я публикую свои выводы здесь в надежде, что они помогут бедняге, ищущему решение этой проблемы со сборкой (и, надеюсь, сэкономят им те несколько волос, которые у них еще остались на голове!).

Краткое изложение того, как создать исполняемый файл и библиотеки OpenSSL FIPS 140-2: (используемая машина для сборки — Windows 7 Ultimate).

Выполните следующие шаги как «Администратор»!!!

1- Установите ActiveState Perl и убедитесь, что путь к среде включает папку bin, в которую был установлен Perl. (См. http://www.activestate.com/activeperl/downloads)

2- Установите Nasm и добавьте путь к переменной окружения %PATH%. (См. http://sourceforge.net/projects/nasm)

3- Установите Visual Studio 2008 Pro, если он еще не установлен (VS2010/2012/2013, похоже, НЕ собирается правильно!!).

4- Распакуйте дистрибутив OpenSSL-FIPS-2.0.9 src в новую папку (НЕ повторно используйте предыдущую папку того же самого!).

5- Распакуйте дистрибутив OpenSSL-1.0.2 src в новую папку (опять же: НЕ повторно используйте предыдущую папку того же самого!).

6- Запустите командное окно DOS Visual Studio 2008 (Пуск->Программы->MS Visual Studio 2008->Командное окно Visual Studio DOS).

7- В этом окне DOS: «Установите FIPSDIR=C:\OpenSSL-FIPS-2.0.9» (или любое другое имя папки, в котором находится дистрибутив src OpenSSL-FIPS-2.0.9, только что распакованный на шаге 4 выше. Также: следует указать абсолютный путь для ФИПСДИР!!!).

8- При сборке для цели x86 обязательно: «Установите PROCESSOR_ARCHITECTURE=x86» в этом командном окне DOS. (Иначе сбои связи!).

9- CD C:\OpenSSL-FIPS-2.0.9 (или аналогичный) и введите: «ms\ms_fips». В конце сборки должно появиться сообщение «УСПЕШНАЯ СБОРКА».

10- CD C:\OpenSSL-1.0.2 и введите в командной строке DOS следующее:

    -Perl Configure VC-WIN32 fips --prefix=C:\Build-OpenSSL-FIPS209
        (C:\Build-OpenSSL-FIPS209 will contain the build results when invoking 'INSTALL'. See below.)

    -ms\do_nasm  (ms\do_ms is NOT acceptable for FIPS-140-2 certification! Will use MASM instead of NASM)
        (For DEBUG versions then use flag debug-VC-WIN32 instead, then open ms\nt.mak after executing ms\do_nasm and replace all occurrences of /Zi with /Z7. There should be three replacements. For 64-bit, use VC-WIN64A and ms\do_win64a. If ECP source distros were used in generating the FIPS library in the first step, then    corresponding "FIPS capable" OpenSSL must be built with the no­ec2m option.)

    -nmake -f ms\nt.mak  (for static libs. To build shared libs use: ntdll.mak)

    -nmake -f ms\nt.mak install

11- Готово. Убедитесь, что папка (--prefix) «C:\Build-OpenSSL-FIPS209» теперь содержит библиотеки, исполняемый файл и файлы заголовков.

person Ismail Fenni    schedule 09.03.2015

В документации openssl есть упоминание об этой ошибке, которая предполагает, что вы не создали и скомпилировал/связал соответствующую ссылку на приложение.

В качестве альтернативы я думаю, что эта ошибка может возникнуть, если вы не связали библиотеку openssl с кодом с правильной средой выполнения (например, /MD, если вы компилируете код оболочки c/c++).

person Peter Ritchie    schedule 03.09.2012
comment
Я не подключаю библиотеку OpenSSL к своему коду — я использую ее с .NET через pinvoke. Мне удалось заставить версию 1.0.0d работать нормально, но производительность лучше в версии 1.0.1d (которую я не могу заставить работать, как в вопросе) - person Cocowalla; 04.09.2012
comment
Хм, единственное, о чем я могу думать, это то, что CRT не инициализируется должным образом при запуске openssl. Возможно, вызов __crt_dll_initialize перед вызовом FIPS_mode_set. Насколько я знаю, это необходимо только для приложения смешанного режима. Вы где-нибудь пишете какой-нибудь управляемый C++? - person Peter Ritchie; 04.09.2012
comment
Извините, это была ошибка выше - у меня работала версия 0.9.8x, не 1.0.0d (которая, я считаю, вообще не совместима с контейнером FIPS) - person Cocowalla; 04.09.2012

Попробуйте лучше использовать это: http://sourceforge.net/projects/openssl-net/ - это избавит вас от многих вопросов.

OpenSSL сложен, поэтому библиотека-оболочка C# действительно поможет. Чтобы использовать OpenSSL, вам нужно использовать pinvoke, что определенно делает эта библиотека.

В качестве альтернативы вы можете использовать внешнюю утилиту stunnel http://www.stunnel.org/index.html, или используйте openssl напрямую через exec(), и таким образом вы можете добиться большей стабильности для каждой операции, если библиотека .NET не работает должным образом.

Было бы действительно рекомендовано использовать WIndows Crypto API - http://msdn.microsoft.com/en-us/library/windows/desktop/aa388162(v=vs.85).aspx, поскольку он основан на стандарте, он работает так же, через C # и даже MSIE, использующий системный репозиторий сертификатов, который также выполняет импорт и экспорт.

person Andrew    schedule 03.09.2012
comment
Обертывает ли openssl.net библиотеку FIPS? - person Peter Ritchie; 04.09.2012
comment
Ты издеваешься? :-) Я бы переписал openssl, прежде чем заставить его работать таким образом. - person Andrew; 04.09.2012
comment
ОП спросил о FIPS. Я предполагаю, что FIPS требуется. Переписывание openssl не даст сертификат FIPS. Итак, я должен спросить: вы шутите? - person Peter Ritchie; 04.09.2012
comment
@PeterRitchie openssl-net является оберткой для родной библиотеки openssl. Включенная сборка, вероятно, не соответствует FIPS, но вы, вероятно, можете заменить свою собственную сборку. - person CodesInChaos; 04.09.2012
comment
Хотя я не слишком люблю openssl-net. В прошлый раз, когда я проверял, они ошиблись в соглашении о вызовах, имели несколько других ошибок, а их высокоуровневый код был довольно сомнительным. - person CodesInChaos; 04.09.2012
comment
FIPS требуется, и библиотеки OpenSSL, распространяемые с OpenSSL.NET, не используют контейнер FIPS. Я не могу заменить его своей сборкой, потому что... ну, вот в чем мой вопрос! Когда я пытаюсь использовать свою собственную сборку с .NET, я получаю эту ошибку - person Cocowalla; 04.09.2012
comment
@AndrewSmith Я не хочу использовать встроенные средства шифрования .NET из соображений производительности (да, это проблема для рассматриваемого приложения). Например, SHA-384 в 3 раза быстрее в OpenSSL. - person Cocowalla; 04.09.2012
comment
@CodesInChaos CallingConvention был «исправлен» (поведение изменилось в более поздних средах выполнения .NET). Некоторые другие ошибки были исправлены. Можете ли вы прислать мне электронное письмо или отчет об ошибке в высокоуровневом коде, который вы считаете сомнительным? Крипто-оболочка намного более зрелая, чем оболочка SSL. - person fried; 27.02.2013