Windows 平台须知

  • openssl
  • 发布于 2025-01-28 10:26
  • 阅读 17

本文档提供了在 Windows 平台上构建和运行 OpenSSL 的各种选项,包括使用 Visual C++、Embarcadero C++Builder、MinGW 进行原生构建,以及使用 Cygwin 进行托管构建。详细介绍了每种构建方式的先决条件、快速入门步骤、安装目录以及链接原生应用程序的注意事项。

Windows 平台说明

有多种选项可以在 Windows 平台上构建和运行 OpenSSL。

“原生”OpenSSL 在运行时直接使用 Windows API。要构建原生 OpenSSL,你可以使用:

Microsoft Visual C++ (MSVC) C 编译器在命令行中

或者

Embarcadero C++Builder

或者

MinGW 交叉编译器
  在类 GNU 开发环境 MSYS2 上运行
  或在 Linux 或 Cygwin 上运行

“托管”OpenSSL 依赖于外部 POSIX 兼容层来进行构建(使用 GNU/Unix shell,编译器和工具)和运行时。对于此选项,你可以使用 Cygwin。

使用 Visual C++ 进行原生构建

使用 Visual C++ 的原生构建具有 VC-* 前缀。

需求细节

除了 INSTALL.md 中列出的需求和说明外,还需要以下内容:

Perl

我们推荐 Strawberry Perl,可从 <http://strawberryperl.com/> 获取 请阅读 NOTES.PERL 以获取更多信息,包括 CPAN 的使用。 另一种选择是 ActiveState Perl,<https://www.activestate.com/ActivePerl> 对于它,你可能需要通过 <https://platform.activestate.com/ActiveState> 显式构建 Perl 模块 Win32/Console.pm,然后下载它。

Microsoft Visual C 编译器。

由于它们是专有的且不断变化,我们无法测试所有版本。 旧版本可能无法工作。 尽可能使用最新版本。

Netwide Assembler (NASM)

NASM 是唯一支持的汇编器。 可从 <https://www.nasm.us> 获取。

快速开始

  1. 安装 Perl

  2. 安装 NASM

  3. 确保 Perl 和 NASM 都在你的 %PATH% 中

  4. 使用具有管理权限的 Visual Studio 开发人员命令提示符, 根据预期架构选择其变体之一。 或者运行 cmd 并使用选项 x86x86_amd64x86_armx86_arm64amd64amd64_x86amd64_armamd64_arm64 之一执行 vcvarsall.bat。 这将设置 nmake.execl.exe 等所需的环境变量。 另请参阅 <https://docs.microsoft.com/cpp/build/building-on-the-command-line>

  5. 从 OpenSSL 源代码目录的根目录输入

    • perl Configure VC-WIN32 如果你想要 32 位 OpenSSL 或
    • perl Configure VC-WIN64A 如果你想要 64 位 OpenSSL 或
    • perl Configure VC-WIN64-ARM 如果你想要 Arm 上的 Windows (win-arm64) OpenSSL 或
    • perl Configure VC-WIN64-CLANGASM-ARM 如果你想要 Arm 上的 Windows (win-arm64) OpenSSL 与使用 clang-cl 作为汇编器的汇编支持或
    • perl Configure VC-CLANG-WIN64-CLANGASM-ARM 如果你想要 Arm 上的 Windows (win-arm64) OpenSSL 使用 clang-cl 作为编译器和汇编器或
    • perl Configure VC-WIN32-HYBRIDCRT 如果你想要依赖于通用 CRT 的 32 位 OpenSSL 或
    • perl Configure VC-WIN64A-HYBRIDCRT 如果你想要依赖于通用 CRT 的 64 位 OpenSSL 或
    • perl Configure 让 Configure 确定平台
  6. nmake

  7. nmake test

  8. nmake install

有关完整的安装说明,或者如果任何阶段出现问题,请查看 INSTALL.md 文件。

安装目录

在大多数 Unix 平台上,安装目录在构建时通过常量定义确定。但是,在 Windows 平台上,安装目录通过注册表项确定,因为构建 OpenSSL 并将其安装到各种位置是常见的做法。

以下键:

\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-&lt;version>-&lt;ctx>\OPENSSLDIR
\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-&lt;version>-&lt;ctx>\ENGINESDIR
\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-&lt;version>-&lt;ctx>\MODULESDIR

可以以管理方式设置,并且 openssl 将采用在那里找到的路径作为 OPENSSLDIR、ENGINESDIR 和 MODULESDIR 的值。

要启用从 Windows 构建读取注册表项,请将 -DOSSL_WINCTX=&lt;string> 添加到 Configure 命令行。此定义在构建时用于 构建特定于库构建的注册表键路径,格式为: \\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432node\OpenSSL-&lt;version>-&lt;ctx>

其中 &lt;version> 是正在构建的库的主要版本号,&lt;ctx>-DOPENSSL_WINCTX 指定的值。这允许在单个系统上创建和安装多个 openssl 构建,其中每个库都可以使用其自己的注册表项集。

请注意,<https://github.com/openssl/installer> 提供的安装程序将在运行安装程序时设置这些键。

Windows 平台上的行为摘要表

OSSL_WINCTX 注册表键 OpenSSL 行为
已定义 已定义 OpenSSL 从注册表中读取路径
已定义 未定义 OpenSSL 在模块/配置加载时返回错误
未定义 N/A OpenSSL 使用构建时默认值

通用 Windows 平台构建的特殊说明,又名 VC-*-UWP

  • UWP 目标仅支持构建静态和动态库。

  • 在编译之前,你应该将平台类型定义为 uwp,并通过 vcvarsall.bat 定义目标架构。例如,如果要构建 arm64 版本,则应运行 vcvarsall.bat x86_arm64 uwp

使用 Embarcadero C++Builder 进行原生构建

此工具链(Turbo/Borland C++ 的后代)是 MSVC 的替代方案。OpenSSL 当前包括针对 v10.3.3 Community Edition 中基于 Clang 的编译器(bcc32c.exebcc64.exe)的实验性 32 位和 64 位配置。 <https://www.embarcadero.com/products/cbuilder/starter>

  1. 安装 Perl。

  2. 打开 RAD Studio 命令提示符。

  3. 转到 OpenSSL 源代码目录的根目录并运行: perl Configure BC-32 --prefix=%CD% 对于 Win64 构建,请使用: perl Configure BC-64 --prefix=%CD%

  4. make -N

  5. make -N test

  6. 针对此 OpenSSL 构建你的程序:

    • 将你的包含搜索路径设置为 OpenSSL 的“include”子目录。
    • 将你的库搜索路径设置为 OpenSSL 源代码目录。

请注意,这是非常实验性的。 对 64 位和其他 Configure 选项的支持仍在等待中。

使用 MinGW 进行原生构建

MinGW 提供了一种通过交叉编译构建原生 OpenSSL 的替代方法。

  • 通常,构建是在 Windows 的类 GNU 环境(称为 MSYS2)中完成的。

    MSYS2 提供 GNU 工具、类 Unix 命令提示符和 用于应用程序的 UNIX 兼容层。 但是,在这种情况下,它仅用于构建 OpenSSL。 生成的 OpenSSL 不依赖于 MSYS2 运行,并且是完全原生的。

    需求细节

    • MSYS2 shell,来自 <https://www.msys2.org/>

    • Perl,至少 5.10.0 版本,通常预先安装在 MSYS2 中

    • make,使用 pacman -S make 安装到 MSYS2 环境中

    • MinGW[64] 编译器:mingw-w64-i686-gcc 和/或 mingw-w64-x86_64-gcc。 这些编译器必须在你的 MSYS2 $PATH 中。 一个常见的错误是没有将它们放在你的 $PATH 中。 MSYS2 版本的 gcc 在这里无法正常工作。

    在 MSYS2 shell 中,根据目标架构执行配置:

./Configure mingw ...

或者

./Configure mingw64 ...

或者

./Configure ...

对于默认架构。

除此之外,请遵循 INSTALL.md 中的 Unix/Linux 说明。

  • 也可以在 Linux 或 Cygwin 上构建 mingw[64]。

    在这种情况下,使用相应的 --cross-compile-prefix= 选项进行配置。 例如

./Configure mingw --cross-compile-prefix=i686-w64-mingw32- ...

或者

./Configure mingw64 --cross-compile-prefix=x86_64-w64-mingw32- ...

这要求你已安装 mingw[64] 交叉编译所需的附加软件包。

链接原生应用程序

本节适用于所有原生构建。

如果你使用静态 OpenSSL 库进行链接,则你还需要将你的应用程序与 WS2_32.LIBGDI32.LIBADVAPI32.LIBCRYPT32.LIBUSER32.LIB 链接。 那些开发 非交互式服务应用程序的人可能会担心与 GDI32.LIBUSER32.LIB 链接,因为它们与非交互式桌面相关联,这在服务进程中不可用。 该工具包旨在检测它当前在哪个上下文中执行,GUI、控制台应用程序或服务,并采取相应的行动,即是否实际进行 GUI 调用。 此外,那些希望 /DELAYLOAD:GDI32.DLL/DELAYLOAD:USER32.DLL 并实际使其远离服务进程的人应该考虑实现并从所讨论的 .exe 映像中导出自己的不依赖于 USER32.DLL_OPENSSL_isservice。 例如,在 Windows Vista 及更高版本上,你可以:

__declspec(dllexport) __cdecl BOOL _OPENSSL_isservice(void)
{
    DWORD sess;

    if (ProcessIdToSessionId(GetCurrentProcessId(), &sess))
        return sess == 0;
    return FALSE;
}

如果你使用 OpenSSL .DLL 进行链接,那么你需要将一个小的“shim”代码段包含到你的应用程序代码中,该代码段提供 OpenSSL BIO 层和你的编译器运行时之间的粘合剂。 另请参见 OPENSSL_Applink 手册页。

使用 Cygwin 进行托管构建

Cygwin 在 Windows 子系统之上实现了一个 POSIX/Unix 运行时系统 (cygwin1.dll),并提供了一个 Bash shell 和 GNU 工具环境。 因此,使用 Cygwin 构建 OpenSSL 实际上与 Unix 过程相同。

要使用 Cygwin 构建 OpenSSL,你需要:

  • 安装 Cygwin,请参见 <https://cygwin.com/>

  • 安装 Cygwin Perl,至少 5.10.0 版本 并确保它在 $PATH 中

  • 运行 Cygwin Bash shell

除此之外,请遵循 INSTALL.md 中的 Unix/Linux 说明。

注意:由于 Cygwin 删除回车符,make test 和正常的文件操作可能在挂载为文本的目录(即 mount -t c:\somewhere /home)中 失败。为避免这种情况,请确保使用二进制挂载,例如 mount -b c:\somewhere /home

  • 原文链接: github.com/openssl/opens...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
openssl
openssl
江湖只有他的大名,没有他的介绍。