win10+VS2019编译64位OpenSSL3.2动态库和静态库

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 :
StrawberryPerl下载

然后就可以下载下来一个.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的路径加进去就可以了:
环境变量.png
上面的截图中可以看到Strawberry Perl刚刚自动添加好的路径。

2.3 测试是否安装成功

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

3. 编译OpenSSL

以管理员身份运行一个VS的命令提示行窗口(若不是VS的命令行窗口的话会在编译OpenSSL的时候提示“找不到cl”之类的报错),因为我要编译64位的OpenSSL,所以我这里也是打开的一个64位的命令提示行窗口,如下图所示:
Native命令提示符窗口示意.png
打开命令提示窗口以后,需要修改当前路径到OpenSSL的源码目录中,以我自己的路径为例,依次输入:

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

修改路径完毕,准备一个输出的路径:E:\#VS_Project\BuildOpenSSL3,配置一下OpenSSL:
若要编64位的动态库,输入:

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

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

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

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

nmake

等待编译完成,需要等挺长时间的。
紧接着执行:

nmake install

此时将安装到之前配置时指定的目录,也需要等挺长时间的。
安装完毕,去之前配置的目录查看安装后的文件及结果,如下所示:
OpenSSL编译结果
编译出的lib在\lib文件夹中,若是动态库的话,dll在\bin文件夹中。

4. 遇到的一些问题

4.1 编译失败

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

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

如下图所示:
在5600X上编译报错的截图.png
然后就停止编译,编译失败了。
然后我就在公司内网的电脑上编译,就都挺顺利的,按照教程安装了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.

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

set LC_ALL=C
set LANG=C

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

5. 参考文章

编译OpenSSL教程1:
https://zhuanlan.zhihu.com/p/645132657
编译OpenSSL和直接安装OpenSSL教程:
参考文章
编译OpenSSL教程1:
https://zhuanlan.zhihu.com/p/645132657
编译OpenSSL和直接安装OpenSSL教程:
http://www.bryh.cn/a/371631.html

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值