本文档提供了在 Windows 平台上构建和运行 OpenSSL 的各种选项,包括使用 Visual C++、Embarcadero C++Builder、MinGW 进行原生构建,以及使用 Cygwin 进行托管构建。详细介绍了每种构建方式的先决条件、快速入门步骤、安装目录以及链接原生应用程序的注意事项。
有多种选项可以在 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++ 的原生构建具有 VC-*
前缀。
除了 INSTALL.md
中列出的需求和说明外,还需要以下内容:
我们推荐 Strawberry Perl,可从 <http://strawberryperl.com/> 获取 请阅读 NOTES.PERL 以获取更多信息,包括 CPAN 的使用。 另一种选择是 ActiveState Perl,<https://www.activestate.com/ActivePerl> 对于它,你可能需要通过 <https://platform.activestate.com/ActiveState> 显式构建 Perl 模块 Win32/Console.pm,然后下载它。
由于它们是专有的且不断变化,我们无法测试所有版本。 旧版本可能无法工作。 尽可能使用最新版本。
NASM 是唯一支持的汇编器。 可从 <https://www.nasm.us> 获取。
安装 Perl
安装 NASM
确保 Perl 和 NASM 都在你的 %PATH% 中
使用具有管理权限的 Visual Studio 开发人员命令提示符,
根据预期架构选择其变体之一。
或者运行 cmd
并使用选项 x86
、x86_amd64
、x86_arm
、x86_arm64
、amd64
、amd64_x86
、amd64_arm
或 amd64_arm64
之一执行 vcvarsall.bat
。
这将设置 nmake.exe
、cl.exe
等所需的环境变量。
另请参阅
<https://docs.microsoft.com/cpp/build/building-on-the-command-line>
从 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 确定平台nmake
nmake test
nmake install
有关完整的安装说明,或者如果任何阶段出现问题,请查看 INSTALL.md 文件。
在大多数 Unix 平台上,安装目录在构建时通过常量定义确定。但是,在 Windows 平台上,安装目录通过注册表项确定,因为构建 OpenSSL 并将其安装到各种位置是常见的做法。
以下键:
\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-<version>-<ctx>\OPENSSLDIR
\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-<version>-<ctx>\ENGINESDIR
\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\OpenSSL-<version>-<ctx>\MODULESDIR
可以以管理方式设置,并且 openssl 将采用在那里找到的路径作为 OPENSSLDIR、ENGINESDIR 和 MODULESDIR 的值。
要启用从 Windows 构建读取注册表项,请将
-DOSSL_WINCTX=<string>
添加到 Configure 命令行。此定义在构建时用于
构建特定于库构建的注册表键路径,格式为:
\\HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432node\OpenSSL-<version>-<ctx>
其中 <version>
是正在构建的库的主要版本号,<ctx>
是 -DOPENSSL_WINCTX
指定的值。这允许在单个系统上创建和安装多个 openssl 构建,其中每个库都可以使用其自己的注册表项集。
请注意,<https://github.com/openssl/installer> 提供的安装程序将在运行安装程序时设置这些键。
Windows 平台上的行为摘要表
OSSL_WINCTX |
注册表键 | OpenSSL 行为 |
---|---|---|
已定义 | 已定义 | OpenSSL 从注册表中读取路径 |
已定义 | 未定义 | OpenSSL 在模块/配置加载时返回错误 |
未定义 | N/A | OpenSSL 使用构建时默认值 |
VC-*-UWP
UWP 目标仅支持构建静态和动态库。
在编译之前,你应该将平台类型定义为 uwp
,并通过 vcvarsall.bat
定义目标架构。例如,如果要构建 arm64
版本,则应运行 vcvarsall.bat x86_arm64 uwp
。
此工具链(Turbo/Borland C++ 的后代)是 MSVC 的替代方案。OpenSSL 当前包括针对 v10.3.3 Community Edition 中基于 Clang 的编译器(bcc32c.exe
和 bcc64.exe
)的实验性 32 位和 64 位配置。
<https://www.embarcadero.com/products/cbuilder/starter>
安装 Perl。
打开 RAD Studio 命令提示符。
转到 OpenSSL 源代码目录的根目录并运行:
perl Configure BC-32 --prefix=%CD%
对于 Win64 构建,请使用:
perl Configure BC-64 --prefix=%CD%
make -N
make -N test
针对此 OpenSSL 构建你的程序:
请注意,这是非常实验性的。 对 64 位和其他 Configure 选项的支持仍在等待中。
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.LIB
、GDI32.LIB
、ADVAPI32.LIB
、CRYPT32.LIB
和 USER32.LIB
链接。 那些开发
非交互式服务应用程序的人可能会担心与 GDI32.LIB
和 USER32.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 在 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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!