柚子快报邀请码778899分享:openssl3.2 - 编译

http://yzkb.51969.com/

文章目录

openssl3.2 - 编译概述OpenSSL源码下载编译目标如何编译前置环境 - perl前置环境 - VS前置环境 - NASM快速编译步骤编译 - Quick startInstall PerlInstall NASMUse Visual Studio Developer Command Prompt with administrative privilegesFrom the root of the OpenSSL source directory enter补充 - perl Configure 的选项列表补充 - 编译一个debug版补充 - 加入zlib特性debian12下的openssl3.2的编译和设置装了一个debian12.4

安装开发工具编译openssl3.2

备注备注备注 - openssl编译时, 不要指定动态依赖的dll为绝对路径.编译release版的openssl3.2END

openssl3.2 - 编译

概述

ECC实现没有轻量级的工程, 那就只能用openssl了. 先从头编译一个OpenSSL.

OpenSSL源码下载

当前OpenSSL稳定版为3.2, 官方源码包url : https://www.openssl.org/source/openssl-3.2.0.tar.gz 将OpenSSL工程迁出到本地(学习和查找资料) : https://github.com/openssl/openssl.git

编译目标

在win10下编译成x64版本的OpenSSL, 用VS2019来编译源码包.

如何编译

看源码包中的README.md

前置环境 - perl

前置环境 - VS

我这已经有了VS2019企业版

前置环境 - NASM

去NASM官方, 看到当前稳定版为2.16.01, 选win64版本.

快速编译步骤

不过, 看到文档中有说, 如果OpenSSL的编译选用运行时库(忘了那个文档这么说, 反正是官方的), 要和应用程序选用的运行时库配套, 否则有问题. 所以不想采用快速编译步骤. 想再看看INSTALL.md, 看看编译参数怎么写. 编译出供VS2019用的debug版和release版的OpenSSL输出. 包含4种运行时库的版本. 我们平时主要用的运行时库就2种(/MD, /MDd), 因为都使用DLL版本的运行时库, 不静态包含运行时库. INSTALL.md写的挺详细的, 有编译选项怎么写, 我主要关注怎么选择不同的运行时库. 看了一圈没看到如何选择运行时库. 算了, 那就按照快速编译的文档, 将编译命令整理一下, 执行编译. 也许编译完, 安装后, 就有不同运行时库的版本.

编译 - Quick start

Install Perl

这步有了, 前面已经装了 ActivePerl-5.26.0.2600-MSWin32-x86-64int-403866.rar 且在命令行下可以直接访问到Perl

C:\Users\chenx>perl --version

This is perl 5, version 26, subversion 0 (v5.26.0) built for MSWin32-x86-multi-thread-64int

(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2017, Larry Wall

Binary build 2600 [403866] provided by ActiveState http://www.ActiveState.com

Built Aug 30 2017 16:46:44

Perl may be copied only under the terms of either the Artistic License or the

GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on

this system using "man perl" or "perldoc perl". If you have access to the

Internet, point your browser at http://www.perl.org/, the Perl Home Page.

Install NASM

装了nasm-2.16.01-installer-x64.exe, 安装位置 c:\nasm 打开命令行, nasm.exe并不在PATH环境变量中. 因为nasm仅仅在编译时使用, 准备在命令行中临时加环境变量的方法, 可以减轻环境变量的污染.

Use Visual Studio Developer Command Prompt with administrative privileges

要编译x64版本, 打开vs2019x64本地命令行, 选择管理员身份运行. 设置临时变量, 加入nasm路径

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

** Visual Studio 2019 Developer Command Prompt v16.11.32

** Copyright (c) 2021 Microsoft Corporation

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

[vcvarsall.bat] Environment initialized for: 'x64'

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise>set path=c:\nasm;%path%

测试一下, nasm是否可以访问

C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise>nasm -v

NASM version 2.16.01 compiled on Dec 21 2022

在vs2019命令行中也能访问到perl, 和普通命令行中一致.

From the root of the OpenSSL source directory enter

进入openssl源码包路径, 用perl配置openssl, 选择输出路径前缀, 选择VS x64版本 默认的安装路径要改一下, 不想用.

cd /d D:\3rd_prj\crypt\openssl-3.2.0

perl Configure VC-WIN64A --prefix=c:\openssl_3d2 --openssldir=c:\openssl_3d2\common

openssl提示, 说缺nmake.exe或者dmake.exe. 但是nmake是可以在当前命令行运行的. 如果在vs2019命令行中, 不能运行nmake, 那还了得… 应该是openssl搞错了, 不理这个错误提示.

nmake

编译的时间好长, 等编译完成.

nmake test

// 测试的时间也好长

All tests successful.

Files=294, Tests=3408, 867 wallclock secs ( 4.92 usr + 0.98 sys = 5.91 CPU)

Result: PASS

测试通过了, 从里面能看出有些特性没有, 以后如果需要, 可以在配置中加上, 重新编译, 如果没有特殊要求, 就用openSSL默认的编译输出.

01-test_fipsmodule_cnf.t ................ skipped: Test only supported in a fips build

01-test_symbol_presence.t ............... skipped: This is unsupported on platforms that don't have 'nm'

03-test_fipsinstall.t ................... skipped: Test only supported in a fips build

04-test_bio_tfo.t ....................... skipped: This test requires enable-tfo

05-test_rc5.t ........................... skipped: rc5 is not supported by this OpenSSL build

07-test_bio_comp.t ...................... skipped: No compression algorithms

20-test_cli_fips.t ...................... skipped: Test only supported in a fips build with security checks

30-test_acvp.t .......................... skipped: ACVP is not supported by this test

30-test_afalg.t ......................... skipped: test_afalg not supported for this build

30-test_pairwise_fail.t ................. skipped: These tests are unsupported in a non fips build

40-test_rehash.t ........................ skipped: test_rehash is not available on this platform

60-test_x509_store.t .................... skipped: test_rehash is not available on this platform

70-test_tls13certcomp.t ................. skipped: test_tls13certcomp needs compression and algorithms enabled

80-test_pkcs12.t ........................ skipped: Non-Greek system locale

82-test_tfo_cli.t ....................... skipped: test_tfo_cli needs tfo enabled

90-test_cert_comp.t ..................... skipped: Certificate compression is disabled in this OpenSSL build

90-test_fipsload.t ...................... skipped: Test is disabled with disabled fips

从测试结果来看, 缺的特性: fips, tfo, rc5, compression algorithms, ACVP, afalg, rehash, 安装

nmake install

安装后的目录结构

C:\openssl_3d2>tree

文件夹 PATH 列表

卷序列号为 BA70-59B2

C:.

├─bin

├─common

│ ├─certs

│ ├─misc

│ └─private

├─html

│ ├─man1

│ ├─man3

│ ├─man5

│ └─man7

│ └─img

├─include

│ └─openssl

└─lib

├─engines-3

└─ossl-modules

安装后的html/manx目录中都是.html文件, 方便查资料. 安装后的目录里面没有demo工程, 需要去看源码包内的demo.

补充 - perl Configure 的选项列表

Configure 是配置文件, 在openssl-3.2.0目录下. 用vsCode打开openssl-3.2.0, 可以看到各种选项, 可以根据自己的需要来配置 perl Configure的参数

往下翻翻, 查找 “–”, 还能看到更具体的参数

补充 - 编译一个debug版

默认编译出来的openssl版本, 在应用程序单步调试时, 也能进入到openssl源码中, 但是发现, 有一些底层函数源码无法步入. 尝试编译一个debug版试试, 是否能解决想进入所有openssl底层函数的需求. 在Configure中多加一个 --debug选项, 其他一样

打开vs2019x64本地命令行, 选择管理员身份运行

set path=c:\nasm;%path%

cd /d D:\3rd_prj\crypt\openssl-3.2.0

perl Configure VC-WIN64A --debug --prefix=c:\openssl_3d2 --openssldir=c:\openssl_3d2\common

nmake

nmake test

nmake install

试过了, 加了–debug选项的库, 可以单步到最底下的函数实现. 如果这个debug版本不能步入一个函数, 有可能这个函数的实现是一个空宏.

补充 - 加入zlib特性

在过官方的demos, 到了CMS工程时, 需要zlib库来进行压缩操作. 默认的openssl3.2官方编译步骤, 是没有zlib特性的.

先自己编译一个zlib库(zlib - 编译)

要加的参数如下: zlib-dynamic --with-zlib-include=our_zlib_header_dir --with-zlib-lib=our_zlib_dll_path_name

为啥要加这些参数? 可以参考 Configure中的内容, 加上自己猜测和实验就知道了.

可用的编译脚本如下:

打开vs2019x64本地命令行, 选择管理员身份运行

set path=c:\nasm;%path%

cd /d D:\3rd_prj\crypt\openssl-3.2.0

perl Configure VC-WIN64A --debug zlib-dynamic --with-zlib-include=c:\zlib_1d3 --with-zlib-lib=c:\zlib_1d3\my_zlib_1d3.dll --prefix=c:\openssl_3d2 --openssldir=c:\openssl_3d2\common

nmake

nmake test

nmake install

一定要执行 ‘nmake test’, 必须测试能完全通过. e.g. --with-zlib-lib=our_zlib_dll_path_name 如果指定错了, nmake test 就会报错.

debian12下的openssl3.2的编译和设置

想验证一下openssl证书操作的脚本在debian12下的效果, 确认一下官方test\certs目录下是否为最新可用的脚本.

装了一个debian12.4

巨长时间

安装好的debian12.4需要做的工作如下:

add现有用户到sudo组更换国内源配置ssh客户端访问

已经做了笔记debian12.4配置

后续的操作都通过ssh客户端连接上debian12.4, 用普通用户来操作

安装开发工具

如果要编译openssl3.2, 需要先安装编译工具包.

sudo apt-get install build-essential gcc g++ libtool automake

编译openssl3.2

配置好vmware16中的共享目录. 将源码.tar.gz放里面

在自己的home目录中新建一个openssl目录, 将共享目录中的源码包拷贝过来.

mkdir ./openssl

sudo cp /mnt/hgfs/crypt/openssl-3.2.0.tar.gz ./openssl/

解压 进入oepnssl3.2的源码包目录.

tar -xzvf ./openssl-3.2.0.tar.gz

cd ./openssl-3.2.0/

# 去root用户下编译,测试,安装opennssl工程

su - root

cd /home/lostspeed/openssl/openssl-3.2.0/

# 先编译一个默认选项的openssl出来, 做测试用. 如果以后需要啥特性, 再加入选项重新编译

./Configure --debug --prefix=/usr/local/openssl_3d2 --openssldir=/usr/local/openssl_3d2/common

make

make test

make install

但是我这次安装完, openssl 就是直接能用的

root@debian12d4x64:/home/lostspeed/openssl# pwd

/home/lostspeed/openssl

root@debian12d4x64:/home/lostspeed/openssl# openssl --help

help:

Standard commands

asn1parse ca ciphers cmp

...

看一下openssl的版本, 是不是我现在编译安装的.

root@debian12d4x64:/home/lostspeed/openssl# openssl --version -a

Invalid command '--version'; type "help" for a list.

root@debian12d4x64:/home/lostspeed/openssl# openssl version -a

OpenSSL 3.0.11 19 Sep 2023 (Library: OpenSSL 3.0.11 19 Sep 2023)

built on: Mon Oct 23 17:52:22 2023 UTC

platform: debian-amd64

options: bn(64,64)

compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -fzero-call-used-regs=used-gpr -DOPENSSL_TLS_SECURITY_LEVEL=2 -Wa,--noexecstack -g -O2 -ffile-prefix-map=/build/reproducible-path/openssl-3.0.11=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2

OPENSSLDIR: "/usr/lib/ssl"

ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-3"

MODULESDIR: "/usr/lib/x86_64-linux-gnu/ossl-modules"

Seeding source: os-specific

CPUINFO: OPENSSL_ia32cap=0xfffa32034f8bffff:0x18405f5ef1bf27eb

++, 不是我安装的, debian原来就带了旧版的openssl. 再确认一下

root@debian12d4x64:/home/lostspeed/openssl# apt list openssl -a

Listing... Done

openssl/stable,now 3.0.11-1~deb12u2 amd64 [installed,automatic]

先卸掉debian12.4自带的openssl

sudo apt-get --purge remove openssl

重新安装一下自己编译的openssl3.2

cd /home/lostspeed/openssl/openssl-3.2.0

make install

现在在普通目录中, 运行openssl, 会找不到. 因为没有安装到/usr/bin

root@debian12d4x64:/home/lostspeed/openssl# openssl version -a

-bash: /usr/bin/openssl: No such file or directory

root@debian12d4x64:/home/lostspeed/openssl# ls -l /usr/bin/openssl

ls: cannot access '/usr/bin/openssl': No such file or directory

切到普通用户, 再试试

lostspeed@debian12d4x64:~/openssl$ openssl version -a

-bash: openssl: 未找到命令

还是因为不在/usr/bin中引起的问题. 做一个软链接到/usr/bin中.

sudo rm /usr/bin/openssl

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

确认软链接指向正确

lostspeed@debian12d4x64:~$ ls -l /usr/bin/openssl

lrwxrwxrwx 1 root root 34 1月20日 14:51 /usr/bin/openssl -> /usr/local/openssl_3d2/bin/openssl

此时, 去普通目录去 openssl --help, 会报错的, 说.so没找到之类的.

lostspeed@debian12d4x64:~$ pwd

/home/lostspeed

lostspeed@debian12d4x64:~$ openssl version -a

openssl: /lib/x86_64-linux-gnu/libssl.so.3: version `OPENSSL_3.2.0' not found (required by openssl)

openssl: /lib/x86_64-linux-gnu/libcrypto.so.3: version `OPENSSL_3.2.0' not found (required by openssl)

lostspeed@debian12d4x64:~$ ls -l /lib/x86_64-linux-gnu/libssl.so.3

-rw-r--r-- 1 root root 696352 10月24日 01:52 /lib/x86_64-linux-gnu/libssl.so.3

/lib/x86_64-linux-gnu/libssl.so.3 是旧版的openss遗留下来的so. 虽然旧版openssl已经卸载了, 还有垃圾so留在系统中.

因为此时, 需要在debian下安装共享库so, 因为debian不知道去哪找我们安装好的.so, 需要登记.

cd /etc/ld.so.conf.d/

sudo touch ./openssl.conf

sudo vi ./openssl.conf

#进入编辑模式, 添加库的路径

# openssl so positon

/usr/local/openssl_3d2/lib64

# 保存退出

看一下编辑好的openssl库配置文件

lostspeed@debian12d4x64:/etc/ld.so.conf.d$ cat ./openssl.conf

#进入编辑模式, 添加库的路径

# openssl so positon

/usr/local/openssl_3d2/lib64

重新载入库配置

sudo ldconfig

现在, 用普通用户, 在普通目录, 再看看openssl是否能操作成功.

lostspeed@debian12d4x64:~$ pwd

/home/lostspeed

lostspeed@debian12d4x64:~$ openssl version -a

OpenSSL 3.2.0 23 Nov 2023 (Library: OpenSSL 3.2.0 23 Nov 2023)

built on: Sat Jan 20 06:02:40 2024 UTC

platform: linux-x86_64

options: bn(64,64)

compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -O0 -g -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_BUILDING_OPENSSL

OPENSSLDIR: "/usr/local/openssl_3d2/common"

ENGINESDIR: "/usr/local/openssl_3d2/lib64/engines-3"

MODULESDIR: "/usr/local/openssl_3d2/lib64/ossl-modules"

Seeding source: os-specific

CPUINFO: OPENSSL_ia32cap=0xfffa32034f8bffff:0x18405f5ef1bf27eb

可以看到, 此时用普通用户权限, 就可以操作openssl了

备注

此致, 在linux下编译配置openssl环境, 已经完成. 如果要在debian1.24下做openssl的实验, 就可以开始弄了.

备注

发现一个严重问题, 因为将系统自带的ssl卸载了, 替换成了openssl3.2的库, 重新启动后, 无法正常启动ssh服务. 只能在虚拟机中测试openssl, 无法用ssh客户端连接到debian12.4x64做实验. 先这样吧, 以后再研究, 如何替换debian12.4系统自带的ssl环境. 应该就是安装的位置不是ssl服务默认的路径, 还有就是openssl-server的openssl接口不是最新的(如果是那样的话, openssl-server这一套都要用最新的openssl3.2替换后重新安装).

备注 - openssl编译时, 不要指定动态依赖的dll为绝对路径.

因为编译完的dll如果用到其他计算机, 如果依赖的dll路径变了, 就会使openssl找不到依赖的dll. 比较好的方法是openssl配置时指定依赖的dll为.\x.dll, 这样只要openssl组件和依赖的dll摆在一起, 就可以让openssl正常运行. 已经做了笔记 => openssl3.2 - 编译 - zlib.dll不要使用绝对路径 因为在配置中将依赖dll指定为了.\x.dll, 编译完后直接测试是通不过的, 需要在测试前手工拷贝依赖的dll到源码目录下的4个子目录, 然后才能测试(nmake test); 同理, 安装(make install)后, 依赖的dll也没有被安装, 需要自己手工拷贝到安装目录.

编译release版的openssl3.2

因为将环境变量都清掉了,写一个bat来启动编译环境

@echo off

:: openssl_build_env.bat

TITLE openssl_build_env.bat

set PATH=C:\Windows\system32;C:\Windows;C:\Program Files\Eclipse Foundation\jdk-8.0.302.8-hotspot\bin;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;D:\3rd_prj\ms\vcpkg\;C:\Windows\System32\WindowsPowerShell\v1.0\;D:\my_dev\lib\nuget;C:\Perl\site\bin;C:\Perl\bin;c:\nasm\;

call %comspec% /k "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvars64.bat"

这个启动脚本中,启动了vs2019本地x64命令行,环境变量中加了perl,nasm

然后执行下列命令,编译一个release版的openssl3.2

cd /d D:\3rd_prj\crypt\openssl-3.2.0_release

perl Configure VC-WIN64A --release zlib-dynamic --with-zlib-include=D:\my_dev\lib\zlib_1d3 --with-zlib-lib=.\my_zlib_1d3.dll --prefix=D:\my_dev\lib\openssl_3d2_release --openssldir=D:\my_dev\lib\openssl_3d2_release\common

nmake

nmake test

nmake install

配置,编译,测试,安装均成功。

END

柚子快报邀请码778899分享:openssl3.2 - 编译

http://yzkb.51969.com/

推荐文章

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: