到 OpenSSL 官网 /index.html 下载 openssl-1.1.1d.tar.gz ,本文中将该压缩文件中 openssl-1.1.1d 子目录中所有的文件解压到 d:\OpenSSL\openssl-1.1.1d 路径下。
编译 OpenSSL 源代码需要用到 C 语言编译器、Perl 语言解释器、汇编编译器,前两项是必选项,最后一项是可选项。这里使用的 C 语言编译器是 Visual Studio 2019 中包含的 C 编译器,首先到微软网站在线安装它,此处安装的是免费的 Community 版本,在安装时会提示用户选择安装时要包含的组件,其中“使用C++的桌面开发”这一项必须勾选上。
接下来安装 Perl 语言解释器,访问网站 Download & Install Perl - ActiveState ,发现现在下载 ActivePerl 之前需要先在线注册了,嫌麻烦决定不用 ActivePerl,改为到网站 Strawberry Perl for Windows 下载安装 StrawBerryPerl 5.30.0.01。这里下载的是 64bit 版,下载后执行安装程序 strawberry-perl-5.30.0.1-64bit.msi,本文中将其安装路径设为 D:\Strawberry。安装完毕后重启计算机,以管理员身份启动命令提示符界面,如下图:
输入命令 perl --version ,如果输出如下图就说明安装成功:
接下来安装 Perl 语言的 Text:: Template 模块,执行命令:cpan Text::Template ,安装完 Text:: Template 模块后,显示如下:
如果使用的 Strawberry Perl 的版本比较新,那么就不需要执行命令 cpan Text::Template 来安装 Text:: Template 模块,因为在新版本的 Strawberry Perl 中已经预置了 Text::Template ,例如在安装 5.32.1.1 版的 Strawberry Perl 之后,执行命令 cpan -l (这里的l是大写字母L对应的小写字母),可查看到已安装的模块列表,其中包含了 Text::Template 。
假设当前路径是 d 盘根目录,为了编译 32 位 OpenSSL 库文件,依次执行以下命令:
mkdir temp-openssl-x86
cd temp-openssl-x86
perl d:\OpenSSL\openssl-1.1.1d\Configure VC-WIN32 no-asm
执行结果如下图:
这里不编译汇编代码,所以加上了 no-asm 参数。如果需要指定编译完成后库文件的存放路径,就要将最后一条命令改为:
perl d:\OpenSSL\openssl-1.1.1d\Configure VC-WIN32 no-asm --prefix=路径名
按以上方式将编译出 OpenSSL 的动态库,如果要编译出静态库,需要将最后一条命令改为:
perl d:\OpenSSL\openssl-1.1.1d\Configure VC-WIN32 no-asm no-shared
完成后可以使用命令 perl configdata.pm --dump 查看编译配置信息。接下来退出命令提示符界面,以管理员身份运行 x86 Native Tools Command Prompt for VS 2019,如下图:
依次执行以下命令:
cd /d d:\temp-openssl-x86
nmake
nmake test
nmake install
完成后动态库的编译就结束了。在默认情况下,编译好的 32 位文件会被拷贝到 C:\Program Files (x86)\OpenSSL 路径下,这里有四个子目录,如下图:
在 bin 目录下包含 openssl.exe 可执行文件、动态库文件 libcrypto-1_1.dll 和 libssl-1_1.dll 及其他文件,如下图:
在html目录下包含 man1 等四个子目录,每个子目录下存放 html 格式的帮助文档,如下图:
在 include 目录下包含 openssl 子目录,子目录下包含 .h 文件,部分 .h 文件名称如下图:
在 lib 目录下下包含 engines-1_1 子目录,以及 libcrypto.lib 和 libssl.lib 文件。注意这两个 lib 文件不是静态库,而是配合 dll 文件使用的导出库文件。lib 目录下内容如下图:
使用命令 openssl version -a 查看以下编译信息,结果如下:
咦,为什么显示的版本是 1.1.1b ? 原因是前面安装过 StrawBerryPerl ,它在安装过程中将一个自带的 1.1.1b 版本的 openssl.exe 拷贝到了 d:\Strawberry\c\bin 路径下,并且将路径 D:\Strawberry\c\bin 添加到了 Windows 系统变量 Path 的取值列表中。这样在命令提示符界面下执行 openssl.exe 时,默认执行的就是 D:\Strawberry\c\bin\openssl.exe ,而不是刚刚编译好的 1.1.1d 版的 exe 文件了。
如果切换到 C:\Program Files (x86)\OpenSSL 路径下,再执行命令 openssl version -a ,这时显示的版本号就是 1.1.1d 了,如下:
接下来编译 64 位的库文件,过程与上面类似。退出命令提示符界面,以管理员身份运行 x64 Native Tools Command Prompt for VS 2019,如下图:
将当前路径切换到 d 盘根目录,依次执行以下命令:
mkdir temp-openssl-x64
cd temp-openssl-x64
perl d:\OpenSSL\openssl-1.1.1d\Configure VC-WIN64A no-asm
这里不编译汇编代码,所以加上了 no-asm 参数。对于x64架构的CPU,使用 VC-WIN64A 参数;对于 IA 64 架构的CPU,使用 VC-WIN64I 参数。现在 IA 64 架构的 CPU 已经很少见了,绝大多数 PC 机的 CPU 架构是 x64 。接下来继续执行以下命令:
nmake
nmake test
nmake install
在默认情况下,编译好的 64 位文件会被拷贝到 C:\Program Files\OpenSSL 路径下,包含四个子目录,如下图:
在 bin 目录下包含 openssl.exe 可执行文件、动态库文件及其他文件,如下图:
注意 64 位的 dll 文件有两个,分别是 libcrypto-1_1-x64.dll 和 libssl-1_1-x64.dll ,这些文件名都以 -x64 结尾,与 32 位的 dll 文件名不同。但是在 lib 目录下,与 dll 文件相关的导出库文件名还是 libcrypto.lib 和 libssl.lib,这两个导出库的文件名与 32 位的导出库文件名相同,如下图:
切换到 C:\Program Files\OpenSSL 路径下,在使用命令 openssl version -a 查看一下编译信息,结果如下:
在以上编译过程中,并没有编译 OpenSSL 中的汇编代码,如果需要的话必须使用 NASM。到网站 https://www.nasm.us/ 可下载。注意 NASM 的安装文件分为 32 位版和 64 位版。例如对于当前稳定版 2.14.02,64 位的安装文件名为 nasm-2.14.02-installer-x64.exe ,32 位的安装文件名为 nasm-2.14.02-installer-x86.exe。将来要编译 32 或 64 位的 OpenSSL 库文件,就要下载安装对应位数的 NASM。