在.NET中使用FIPS模式的OpenSSL

时间:2012-09-01 18:33:01

标签: .net c build openssl fips

我构建了OpenSSL FIPS容器版本2.0.1,然后使用该容器构建了OpenSSL 1.0.1c(根据 OpenSSL FIPS对象模块v2.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构建OK?< / p>

3 个答案:

答案 0 :(得分:1)

我徒劳地搜索了有关如何构建支持OpenSSL FIPS的可执行文件的完整说明,并且只发现了挫败感和死胡同。我终于通过大量的试错运行,发现以下工作没有任何构建错误。我在这里发布我的发现,希望它能帮助一个贫穷的灵魂找到解决这个构建问题的解决方案(并希望能保留他们仍留在头上的几根头发!)。

如何生成FIPS 140-2 OpenSSL可执行文件和库的摘要: (使用的构建机器是Windows 7 Ultimate)。

执行以下步骤作为'管理员'!!!

1-安装ActiveState Perl并确保环境路径包含已安装Perl的bin文件夹。 (见http://www.activestate.com/activeperl/downloads

2-安装Nasm并添加%PATH%环境变量的路径。 (见http://sourceforge.net/projects/nasm

3-安装Visual Studio 2008 Pro(如果尚未安装)(VS2010 / 2012/2013 NOT 似乎构建正确!!)。

4-将OpenSSL-FIPS-2.0.9 src发行版解压缩到一个新文件夹( NOT 重用以前的文件夹!)。

5-将OpenSSL-1.0.2 src分发解压缩到一个新文件夹(再次:执行 NOT 重用以前的文件夹!)。

6-启动Visual Studio 2008 DOS命令窗口(开始 - &gt;程序 - &gt; MS Visual Studio 2008-&gt; Visual Studio DOS命令窗口)。

7-在那个DOS窗口中:“设置FIPSDIR = C:\ OpenSSL-FIPS-2.0.9”(或者在上面的步骤4中解压缩的OpenSSL-FIPS-2.0.9 src发行版中的任何一个文件夹名称。另外:应指定FIPSDIR的绝对路径!!!)。

8-如果为x86目标构建,请确保:从该DOS命令窗口中设置''PROCESSOR_ARCHITECTURE = x86'。 (否则链接失败!)。

9- CD C:\ OpenSSL-FIPS-2.0.9(或等效的)并输入:'ms \ ms_fips'。应该在构建结束时看到“BUILD SUCCESS”。

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'现在是否包含库,可执行文件和头文件。

答案 1 :(得分:0)

在openssl文档中,此错误有mention表示您尚未创建和编译/链接相应的applink

或者,我认为如果您没有将openssl库与代码与正确的运行时链接(例如/ MD,如果您正在编译c / c ++包装器代码),则可能会发生此错误。

答案 2 :(得分:-1)

请尝试使用此功能:http://sourceforge.net/projects/openssl-net/ - 它可以为您节省很多问题。

OpenSSL很复杂,因此C#包装器库真的很好帮助。要使用OpenSSL,您需要使用pinvoke,这个库肯定会这样做。

或者你可以使用外部实用程序stunnel http://www.stunnel.org/index.html,或者使用openssl direclty通过exec(),这样你就可以在每个操作中获得更高的稳定性,以防.NET库表现不佳。

真的建议使用WIndows Crypto API - http://msdn.microsoft.com/en-us/library/windows/desktop/aa388162(v=vs.85).aspx作为标准,它通过C#甚至MSIE以相同的方式工作,使用系统证书存储库,它也可以导入和导出。 / p>