在FIPS模式下与.NET一起使用OpenSSL

在FIPS模式下与.NET一起使用OpenSSL,.net,c,build,openssl,fips,.net,C,Build,Openssl,Fips,我已经构建了OpenSSL FIPS容器版本2.0.1,然后使用该容器构建了OpenSSL 1.0.1c(根据OpenSSL FIPS对象模块v2.0用户指南中的说明): 我在我的.NET应用程序中得到了这些导入(显然是使用上面的libeay32.dll): 问题是,当我调用FIPS\u mode\u set(1)时,它返回0,这表示无法启用FIPS模式 为了找出问题的原因,我正在做以下工作: ERR_load_crypto_strings(); using (FileStream fs =

我已经构建了OpenSSL FIPS容器版本2.0.1,然后使用该容器构建了OpenSSL 1.0.1c(根据OpenSSL FIPS对象模块v2.0用户指南中的说明):

我在我的.NET应用程序中得到了这些导入(显然是使用上面的libeay32.dll):

问题是,当我调用
FIPS\u mode\u set(1)
时,它返回
0
,这表示无法启用FIPS模式

为了找出问题的原因,我正在做以下工作:

ERR_load_crypto_strings();

using (FileStream fs = new FileStream...)
{
  ERR_print_errors_fp(fs.SafeFileHandle);
}
这给了我这个错误信息:

OPENSSL\u上行链路(0FAF1000,08):没有OPENSSL\u Applink

我试着寻找答案,但结果是空的——任何建议都将不胜感激

**更新** 我尝试使用与VisualStudio2008命令行相同的步骤来构建它,而不是使用VisualStudio2010命令行(我以前使用过),并且成功了


但是我不知道为什么它不能与Visual Studio 2010一起工作,我也不想让Visual Studio 2008永远挂在我的身边-知道如何使用Visual Studio 2010构建它吗?

在openssl文档中,有一个错误提示您没有创建和编译/链接适当的

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

请尝试更好地使用它:-它将为您节省大量问题

OpenSSL非常复杂,因此C#包装器库非常有用。要使用OpenSSL,您需要使用pinvoke,这个库肯定会这样做

或者,您可以使用外部实用工具stunnel,或者使用openssl direclty thru exec(),这样在.NET库性能不好的情况下,您可以获得每个操作的更高稳定性


建议使用WIndows Crypto API,因为它是基于标准的,通过C#甚至MSIE,使用系统证书存储库,它的工作方式是相同的,它也进行导入和导出。

我徒劳地搜索了关于如何构建支持OpenSSL FIPS的可执行文件的完整说明,但只找到了挫折和死胡同。最后,通过多次尝试和错误运行,我发现以下内容可以正常工作,没有任何构建错误。我在这里发布我的发现,希望它能帮助一个贫穷的灵魂寻找解决这个构建问题的方法(并希望能让他们少留几根头发!)

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

以“管理员”身份执行以下步骤

1-安装ActiveState Perl并确保环境路径包括安装Perl的bin文件夹。(见附件)

2-安装Nasm并将路径添加到%path%环境变量。(见附件)

3-如果尚未安装Visual Studio 2008 Pro,请安装(VS2010/2012/2013似乎无法正确生成!!)

4-将OpenSSL-FIPS-2.0.9 src分发版解包到新文件夹中(不要重复使用以前的相同文件夹!)

5-将OpenSSL-1.0.2 src发行版解包到新文件夹中(同样:不要重复使用以前的相同文件夹!)

6-启动Visual Studio 2008 DOS命令窗口(开始->程序->MS Visual Studio 2008->Visual Studio DOS命令窗口)

7-在该DOS窗口中:“Set-FIPSDIR=C:\OpenSSL-FIPS-2.0.9”(或上面第4步中解压的OpenSSL-FIPS-2.0.9 src发行版所在的文件夹名称。另外:应指定FIPSDIR的绝对路径!!!)

8-如果为x86目标构建,请确保在DOS命令窗口中:“设置处理器体系结构=x86”。(否则链接会失败!)

9-CD C:\OpenSSL-FIPS-2.0.9(或同等版本)并键入:“ms\ms\u 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-完成。验证(--前缀)文件夹“C:\Build-OpenSSL-FIPS209”现在是否包含库、可执行文件和头文件。

OpenSSL.net是否包装了FIPS库?你在开玩笑吗?:-)我会先重写openssl,然后再让它以这种方式工作。我认为FIPS是必需的。重新编写openssl不会获得FIPS认证。所以,我不得不问:你在开玩笑吗?@PeterRitchie-openssl-net包装了本机的openssl库。包含的构建可能不符合FIPS,但您可能可以替换自己的构建。不过,我并不太喜欢openssl网络。上次我检查时,他们的调用约定有误,还有一些其他错误,他们的高级代码相当可疑。我没有将OpenSSL库链接到我的代码中,我是通过pinvoke将其与.NET一起使用的。我已经能够让版本1.0.0d正常工作,但在版本1.0.1d中性能更好(我无法工作,如问题中所述)嗯,我唯一能想到的是,在运行openssl时CRT没有正确初始化。在调用
FIPS\u mode\u set
之前,可能会先进行pinvoking
\u crt\u dll\u初始化
。据我所知,这只适用于混合模式应用程序。你写的是任何一个托管C++吗?抱歉,这是一个错误,这是我工作的版本0.98X,不是1.0D(我相信根本不兼容FIPS容器)这也许会有帮助:@阿尔克-诺普-彼得已经发布了一个链接,我在任何情况下都见过它。正如我在给Peter的回复中提到的,我并没有将OpenSSL库链接到我的代码中——我是通过PinVokeregard将它与.NET一起使用的。我在编写自己的DLL调用libeay32时遇到了OpenSSL_Applink错误。这个问题来自C和C++的混合。如果你使用了文件IO的生物例程,然后从C++调用它们(并且所有文件IO都发生在C中),那么问题就应该消失了。我从这句话中得到了暗示:
ERR_load_crypto_strings();

using (FileStream fs = new FileStream...)
{
  ERR_print_errors_fp(fs.SafeFileHandle);
}
    -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