文章目录
- openssl3.2 - 编译
- 概述
- OpenSSL源码下载
- 编译目标
- 如何编译
- 前置环境 - perl
- 前置环境 - VS
- 前置环境 - NASM
- 快速编译步骤
- 编译 - Quick start
- Install Perl
- Install NASM
- Use Visual Studio Developer Command Prompt with administrative privileges
- From the root of the OpenSSL source directory enter
- 补充 - perl Configure 的选项列表
- 补充 - 编译一个debug版
- 补充 - 加入zlib特性
- debian12下的openssl3.2的编译和设置
- 安装开发工具
- 备注
- 备注
- 备注 - openssl编译时, 不要指定动态依赖的dll为绝对路径.
- 编译release版的openssl3.2
- VS2013下编译openssl3.2 - debug版
- VS2013下编译openssl3.2 - release版
- END
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
配置,编译,测试,安装均成功。
VS2013下编译openssl3.2 - debug版
- 将zlib1.3先用vs2013x64编译。
- 启动vs2013x64命令行,将nasm, perl的路径临时加进去
set path=C:\Perl\site\bin;C:\Perl\bin;c:\nasm\;%path%
- 将编译好的zlib.dll拷贝到openssl3.2的4个子目录 .; .\apps; .\fuzz; .\test;
- 配置工程
perl Configure VC-WIN64A --debug zlib-dynamic --with-zlib-include=D:\my_dev\lib\zlib_1d3_vs2013 --with-zlib-lib=zlibvc_MultiByte_x64_Debug_v120 --prefix=c:\openssl_3d2_debug --openssldir=c:\openssl_3d2_debug\common
- 用SI建立一个工程,加入可以识别的所有文件目录递归, 替换工程中的 snprintf 为 _snprintf
- nmake
- nmake test
全部测试通过。 - nmake install
- 归档输出到 D:\my_dev\lib\openssl_3d2_debug_vs2013,添加 zlibvc_MultiByte_x64_Debug_v120.dll 到 D:\my_dev\lib\openssl_3d2_debug_vs2013\bin
测试载入的zipDLL是否正确
openssl zlib -list
测试成功
VS2013下编译openssl3.2 - release版
- 将zlib1.3先用vs2013x64编译。
- 启动vs2013x64命令行,将nasm, perl的路径临时加进去
set path=C:\Perl\site\bin;C:\Perl\bin;c:\nasm\;%path%
- 将编译好的zlib.dll拷贝到openssl3.2的4个子目录 .; .\apps; .\fuzz; .\test;
- 配置工程
cd /d D:\3rd_prj\crypt\openssl_3d2d0_release_v64_vs2013
cls
perl Configure VC-WIN64A --release zlib-dynamic --with-zlib-include=D:\my_dev\lib\zlib_1d3_vs2013 --with-zlib-lib=zlibvc_MultiByte_x64_Release_v120 --prefix=c:\openssl_3d2_release_vs2013 --openssldir=c:\openssl_3d2_release_vs2013\common
- 用SI建立一个工程,加入可以识别的所有文件目录递归, 替换工程中的 snprintf 为 _snprintf
- nmake
- nmake test
全部测试通过。 - nmake install
测试载入的zipDLL是否正确
openssl zlib -list
测试成功