编译OpenSSL

发布于:2025-03-13 ⋅ 阅读:(17) ⋅ 点赞:(0)

OpenSSL简介

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

Windows系统

Win10 64bit + vs2019

依赖的工具:
  1.  Nasm 汇编器

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

  1. 下载地址:https://www.nasm.us/

我下载的是:nasm-2.16-installer-x86.exe

  1. 安装后并将安装路径添加到系统环境变量 Path 中,如C:\Program Files (x86)\NASM.
  2. 打开一个命令提示符窗口输入 nasm -v 测试一下这个工具有没有安装成功。

  1.  Perl

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

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

  1. 下载地址:Strawberry Perl for Windows - Releases

我下载的是strawberry-perl-5.32.1.1-32bit.msi

  1. 双击安装就可以了,安装后会自动添加到环境变量中。
  2. 打开一个命令提示符窗口输入perl -v 测试一下这个工具有没有安装成功。

  1.  Visual studio 2019

下载地址:Visual Studio 旧版下载 - 2019、2017、2015

我下装的是vs_community_2019.exe

Openssl源码

源码下载地址:官网  OpenSSL 然后跳转到  https://github.com/openssl/openssl

我下载的是master分支的。即openssl-master.zip

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

  1. 打开命令提示窗口以后,需要修改当前路径到OpenSSL的源码目录(如E:\openssl\code\openssl-master)中.
  2. 输入命令:perl Configure VC-WIN32 --prefix=E:\openssl\build\OpenSSL-Win32-release  

//prefix表示编译输出路径

VC-WIN32        //表示是Win 32位 release动态版本

debug-VC-WIN32  //Win 32位 debug动态版本

VC-WIN64A      //表示是Win 64位 release动态版本

  1. nmake    //编译
  2. nmake test   //测试使用
  3. nmake install   //安装  安装完毕,去之前配置的目录查看安装后的文件及结果。编译出的lib在\lib文件夹中,若是动态库的话,dll在\bin文件夹中

Linux系统

麒麟桌面版

在线安装

直接以root权限打开终端,输入apt install openssl即可安装, 输入openssl version -a查看版本

源码安装
下载openssl源码

下载地址:Downloads | OpenSSL Library

我下载的是:openssl-3.2.0.tar.gz

编译openssl
  1. 解压压缩包

把压缩包放在目录/root/software/openssl,打开终端输入下面命令。

tar -zxvf openssl-3.2.0.tar.gz

  1. config配置

我只编译Linux共享库,所以只加了一个shared参数。安装路径为默认的/usr/local/ssl. 这里设置安装路径为/usr/local/openssl。在/root/software/opensll/openssl-3.2.0打开终端,输入下面命令:

./config  shared --prefix=/usr/local/openssl

延伸说明:

 OpenSSL 的编译过程中,默认配置就是 Release 版本​(即关闭调试模式并启用优化)。如果你需要显式确保编译为 Release 版本,可以通过以下方式手动指定优化选项和禁用调试信息。如

./config \

  --prefix=/usr/local/ssl \

  --openssldir=/usr/local/ssl/conf \

  shared \

  -fPIC \

  no-asm \          # 禁用汇编加速(可选,某些平台需要)

  -O3 \             # 启用最高优化级别

  -DNDEBUG          # 禁用调试断言(可选)

说明:

-DNDEBUG: 禁用 assert() 断言(类似 C/C++ 中的 Release 模式)。

shared :动态库

相反,如果要生成debug,则

./config \

  --prefix=/usr/local/openssl-debug \  # Debug 版本独立路径

  --openssldir=/usr/local/openssl-debug/conf \

  shared \          # 生成动态库

  --debug \         # 启用调试模式

  -g \              # 生成调试符号

  -O0 \             # 禁用优化

  -fPIC \           # 位置无关代码(动态库必需)

  no-asm            # 禁用汇编优化(可选,避免兼容性问题)

验证是否编译为 Release 版本

方法1:检查编译输出的配置信息

运行 ./config 后,输出中会显示 Configuration 信息,确认是否包含 --release 或优化标志:

Operating system: x86_64-whatever-linux2

Configuring OpenSSL version 3.0.12 for target linux-x86_64

Using os-specific seed configuration

Creating configdata.pm

Creating Makefile

**********************************************************************

***   OpenSSL has been successfully configured                     ​***

***   Compiler: gcc -O3 -DNDEBUG -fPIC ...                         ​***

***                                                               ​***

***   Configuration flags: -O3 -DNDEBUG ...                       ​***

**********************************************************************

方法2:检查生成的二进制文件

编译完成后,检查库文件中是否包含调试符号:

# 检查是否包含调试符号(若无输出则为 Release 版本)

file libssl.so.* | grep "not stripped"  # 如果有输出,说明包含调试符号

# 手动去除调试符号(可选)

strip libssl.so.* libcrypto.so.*

 验证 Debug 动态库

# 查看 libssl.so 是否包含调试信息

file /usr/local/openssl-debug/lib/libssl.so.* | grep "with debug_info"

# 使用 objdump 检查符号表(应有调试符号)

objdump --syms /usr/local/openssl-debug/lib/libssl.so.* | grep "\.debug"

  1. make编译

配置好编译选项后,运行make,一直等着就好了.

  1. make test测试

make编译成功后,可以进行make test

  1. make install安装
  2. 备份原来的openssl
    mv /usr/bin/openssl  /usr/bin/openssl_bak
  3. 创建软链接到系统位置

ln -s /usr/local/openssl/bin/openssl  /usr/bin/openssl

  1. 将openssl 的lib 库添加到系统(‘/usr/local/openssl/lib64’ 单引号)

echo '/usr/local/openssl/lib64' > /etc/ld.so.conf.d/openssl.conf

即openssl.conf 的内容是/usr/local/openssl/lib64

  1. 加载lib库

ldconfig

  1. 看看openssl版本

openssl  version

延伸:

# 查看openssl主程序软链接

ls -l /usr/bin/openssl

# 删除openssl主程序软链接

sudo rm -f /usr/bin/openssl

把/usr/bin/的openssl_bak改回openssl

延伸:

在Linux系统中,OpenSSL、libssl和libcrypto之间的关系可以概括如下:

1. ​OpenSSL 项目

​定义:OpenSSL 是一个开源的、功能全面的安全工具包,用于实现SSL/TLS协议以及各种加密算法。

​组成:

​命令行工具:提供如openssl命令,用于执行证书生成、加密解密等操作。

​核心库:包括libssl和libcrypto两个动态库,为其他应用程序提供API。

2. ​libcrypto 库

​功能:实现基础的加密算法(如AES、RSA、SHA等)和底层密码学操作(如随机数生成、密钥管理)。

​作用:作为加密功能的底层依赖,供libssl或其他直接需要加密的应用程序调用。

​位置:通常以libcrypto.so(动态库)或libcrypto.a(静态库)形式存在。

3. ​libssl 库

​功能:基于libcrypto实现SSL/TLS协议,处理安全通信的握手、密钥交换和数据加密传输。

​依赖:必须链接libcrypto,因为它依赖其加密算法完成协议操作。

​位置:通常以libssl.so或libssl.a形式存在。

4. ​三者关系

​层级结构:

OpenSSL项目

├── openssl命令行工具(依赖libssl和libcrypto)

├── libssl(SSL/TLS协议实现,依赖libcrypto)

└── libcrypto(基础加密算法实现)

​协作方式:

应用程序若需SSL功能,需链接libssl;若直接使用加密算法,则链接libcrypto。

openssl命令行工具通过调用这两个库的API完成具体任务(如生成证书、加密文件)。

5. ​实际应用场景

​开发:编写HTTPS服务器时,需包含libssl头文件并链接-lssl -lcrypto。

​系统工具:如curl或wget处理HTTPS请求时,依赖libssl和libcrypto。

​版本管理:不同版本可能引入不兼容变更(如OpenSSL 1.1.x与3.x),需注意依赖匹配。

总结

​OpenSSL 是整体的工具包,包含工具和库。

​libcrypto 提供加密算法的底层实现。

​libssl 基于libcrypto实现SSL/TLS协议,两者共同支撑安全通信功能。命令行工具和第三方应用通过调用这些库实现加密及协议功能。