【问题标题】:Using OpenSSL in FIPS mode with .NET在 FIPS 模式下使用 OpenSSL 与 .NET
【发布时间】:2012-09-01 18:33:00
【问题描述】:

我已经构建了 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 中正常运行吗?

【问题讨论】:

  • @alk 不-彼得已经发布了一个链接,无论如何我以前都见过它。正如我在对 Peter 的回复中提到的,我没有将 OpenSSL 库链接到我的代码中——我通过 pinvoke 将它与 .NET 一起使用
  • 关于 OPENSSL_Applink 错误,我在编写自己的 DLL 以调用 libeay32 时也遇到了该错误。问题来自混合 C 和 C++。如果您将 BIO 例程用于文件 IO,然后从 C++ 调用它们(并且所有文件 io 都在 C 中发生),那么问题应该会消失。我从这条评论中得到了提示:stackoverflow.com/questions/24066318/…

标签: .net c build openssl fips


【解决方案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 确实 似乎构建正确!!)。

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”(或托管 OpenSSL-FIPS-2.0.9 src 分发的任何文件夹名称,刚刚在上面的步骤 4 中解压缩。另外:应该为 FIPSDIR 指定绝对路径!!!)。

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

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

【讨论】:

    【解决方案2】:

    在 openssl 文档中有 mention 的此错误表明您尚未创建和编译/链接适当的 applink

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

    【讨论】:

    • 我没有将 OpenSSL 库链接到我的代码中 - 我通过 pinvoke 将它与 .NET 一起使用。我已经能够让 1.0.0d 版本正常工作,但是 1.0.1d 版本的性能更好(我无法开始工作,就像问题一样)
    • 嗯,我唯一能想到的是,运行 openssl 时 CRT 没有正确初始化。也许在调用FIPS_mode_set 之前先调用__crt_dll_initialize。据我所知,只有混合模式应用程序才需要。您是否在某处编写任何托管 C++?
    • 对不起,这是一个错误 - 我开始工作的是 0.9.8x 版本,不是 1.0.0d(我认为它与 FIPS 容器不兼容全部)
    【解决方案3】:

    尝试使用这个更好:http://sourceforge.net/projects/openssl-net/ - 它会为您节省很多问题。

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

    您也可以使用外部实用程序 stunnel http://www.stunnel.org/index.html,或通过 exec() 直接使用 openssl,这样您可以在每次操作时获得更高的稳定性,以防 .NET 库无法正常运行。

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

    【讨论】:

    • openssl.net 是否封装了 FIPS 库?
    • 你在开玩笑吗? :-) 在以这种方式工作之前,我会重写 openssl。
    • OP 询问了 FIPS。我认为 FIPS 是必需的。重写 openssl 不会获得 FIPS 认证。所以,我不得不问:在开玩笑吗?
    • @PeterRitchie openssl-net 封装了原生的 openssl 库。包含的构建可能不符合 FIPS,但您可能可以替换您自己的构建。
    • 不过我并不太喜欢 openssl-net。上次我检查他们的调用约定错误,还有一些其他错误,而且他们的高级代码相当可疑。
    猜你喜欢
    • 2016-04-11
    • 2017-09-26
    • 2022-12-20
    • 2018-02-06
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    相关资源
    最近更新 更多