文章

Win10+vs2019编译64位openssl3.2动态库和静态库

Win10+vs2019编译64位openssl3.2动态库和静态库

[TOC]

1. OpenSSL

1.1 OpenSSL简介

OpenSSL 是一个用于加密和安全连接的开源软件库。它提供了一系列的加密算法、密码学功能和安全协议的实现,包括 SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)等用于网络安全的协议。OpenSSL 可以帮助开发人员在他们的应用程序中实现数据加密、数字证书的管理、安全连接的建立以及其他各种密码学功能。它被广泛应用于 web 服务器、网络应用程序、虚拟私有网络(VPN)等领域,以增强数据的安全性和保护用户的隐私。

因为需要使用 MD、SHA1 等加密算法,我决定编译 OpenSSL 这个开源库,使用其中的加密算法。(算是大材小用了)

1.2 OpenSSL源码

OpenSSL 的源码可以直接在 Github 下载:

Github上的OpenSSL源码

我是下载的 master,其实就是 OpenSSL3.2,后来使用的时候产生了一些困惑,因为 OpenSSL3 相对于OpenSSL1 放弃了很多函数,导致查到的一些资料里的代码在我这边是编译不过的,得换成 OpenSSL3 的方法才可以。

其实我只需要 MD、SHA1 等算法的话,用 OpenSSL1 也是完全是可以的。

2. 依赖工具

根据 OpenSSL 提供的开发说明,要在 Windows 中编译 OpenSSL,除了 OpenSSL 源码和 VS,还需要安装 Perl 和 NASM:

Github上提供的OpenSSL在Windows下的编译说明

2.1 Strawberry Perl

Perl 是一种功能丰富、强大而灵活的高级编程语言,由 Larry Wall 在1987年首次发布。它以其强大的文本处理能力和灵活的语法而闻名,被广泛用于系统管理、文本处理、网络编程和 Web 开发等领域。尤其擅长文本处理和自动化任务。

Strawberry Perl 是一个为 Windows 操作系统定制的 Perl 发行版。传统的 Perl 发行版在 Windows上 的安装和配置可能会比较复杂,而 Strawberry Perl 旨在简化这个过程。其提供了一些 Windows 特定的扩展和工具,使得在 Windows 上编写和运行Perl脚本更加方便。

OpenSSL 在 Github上的编译说明中也推荐使用 Strawberry Perl:

Strawberry Perl下载网址

也可以下载 Perl 的源码然后自己编译,但我觉得完全没必要:

Perl源码网址

我是下载的 strawberry-perl-5.38.0.1-64bit.msi :

3a65988fbfd556640a40efc5bcec2dc7

然后就可以下载下来一个 .msi 的安装包,双击安装就可以了,安装后会自动添加到环境变量中。

2.2 NASM

NASM 代表 “Netwide Assembler”,是一种开源的、可移植的汇编语言编译器。NASM 专为 x86 和 x86-64 体系结构设计,支持在各种操作系统中生成可执行的机器代码。

其允许开发者以汇编语言编写低级、高效的程序。它提供了一套丰富的指令集和功能,可以直接操作底层硬件,并提供了对多种数据类型(如整数、浮点数和字符串)的支持,以及对标签、宏、条件编译和模块化编程的高级特性。

NASM 是一个非常灵活和强大的工具,它可以生成与特定 CPU 和操作系统完全兼容的机器代码。它支持多种输出格式,包括二进制文件、可引导的磁盘映像、共享库和可执行文件等。常用于编写高效的底层程序和操作系统内核。

NASM直接在网站上下载就行:

NASM安装包下载

我下载的是:nasm-2.16.01-installer-x64.exe

双击安装就可以了。但是NASM不会自动添加环境变量,还需要自己手动添加一下路径。

在我的电脑上【鼠标右键】-【属性】,然后依次按照以下顺序点击:

【高级系统设置】-【高级】-【环境变量】-【系统变量】-【Path】-【编辑】

把 NASM.exe 的路径加进去就可以了:

4db69b8d88f1a262060857742f11bc10

上面的截图中可以看到 Strawberry Perl 刚刚自动添加好的路径。

2.3 测试是否安装成功

随便打开一个命令提示符窗口输入 perl -vnasm -v 测试一下这两个工具有没有安装成功,下图所示即是安装成功了:

88b13bbf85b6bcb6bd0c9d76823477e4

3. 编译OpenSSL

以管理员身份运行一个 VS 的命令提示行窗口(若不是 VS 的命令行窗口的话会在编译 OpenSSL 的时候提示 “找不到cl” 之类的报错),因为我要编译64位的 OpenSSL,所以我这里也是打开的一个64位的命令提示行窗口,如下图所示:

c5b8d13e6f083b9b226c3a697f6435cf

打开命令提示窗口以后,需要修改当前路径到 OpenSSL 的源码目录中,以我自己的路径为例,依次输入:

1
2
E:
cd E:\#VS_Project\openssl-master

修改路径完毕,准备一个输出的路径:E:\#VS_Project\BuildOpenSSL3,配置一下OpenSSL:

若要编64位的动态库,输入:

1
perl Configure VC-WIN64A --prefix=E:\#VS_Project\BuildOpenSSL3

若要编64位的静态库,输入:

1
perl Configure no-shared VC-WIN64A --prefix=E:\#VS_Project\BuildOpenSSL3

等命令行跑完了就会提示成功:OpenSSL has been successfully configured,我这里就不放截图了,当时忘了截了。

然后输入:

1
nmake

等待编译完成,需要等挺长时间的。

紧接着执行:

1
nmake install

此时将安装到之前配置时指定的目录,也需要等挺长时间的。

安装完毕,去之前配置的目录查看安装后的文件及结果,如下所示:

147ee63712ae97df191cc60669a6335b

编译出的lib在\lib文件夹中,若是动态库的话,dll在\bin文件夹中。

4. 遇到的一些问题

4.1 编译失败

我在我自己的主机 5600X 和 7735H 上都尝试编译 OpenSSL3.2,但是都失败了,都是在开始调用 cl 命令的时候提示:

cl:命令行 error D8003:缺少原文件名

如下图所示:

10e89f7a979bbdb51a92c0fd45bb48b8

然后就停止编译,编译失败了。

然后我就在公司内网的电脑上编译,就都挺顺利的,按照教程安装了 perl 和 nasm 之后,用 VS 的命令窗口依次输入命令,一切就顺利的编译出来了。编译了一套动态库的和一套静态库的。

至于为什么我自己两台主机编译不出来,我猜测是因为我自己没有把 VS 装在 C 盘导致的,但是反正现在也已经有能用的 OpenSSL 库了,也就不再探索为什么了。

4.2 提示语言不对

我在自己的主机上安装了 strawberry-perl-5.38.0.1-64bit.msi 以后,在cmd中运行perl -v时总是提示:

Locale ‘Chinese (Simplified)_China.936’ is unsupported, and may crash the interpreter.

总是会提示这个,可以通过输入以下命令消除这一行提示:

1
2
set LC_ALL=C
set LANG=C

但是总感觉不对,所以就又下载了 5.36 版本的 StrawBerryPerl,但是因为后面在公司的内网机上成功编出来了,所以这个问题就也无所谓了。

5. 参考文章

编译OpenSSL教程1:https://zhuanlan.zhihu.com/p/645132657

编译OpenSSL和直接安装OpenSSL教程:http://www.bryh.cn/a/371631.html

本文由作者按照 CC BY 4.0 进行授权