CMake构建学习笔记19-OpenSSL库的构建
1. 概述
OpenSSL是一个开源的加密工具包和库,主要实现了安全套接字层(SSL)和传输层安全(TLS)协议,以及各种加密算法、数字签名、消息摘要、加密证书等功能。这个库可以说是Web开发尤其是HTTPS通信的基石了。这里就具体讲解一下如何构建它。
2. 构建过程
2.1 Windows环境
首先要说明的是OpenSSL目前的版本(我使用的是3.4.0版本)还没有支持使用CMake构建。但是好在作为老牌的开源库,它的构建文档非常详细。先介绍一下Windows环境下的构建,Windows下当然使用MSVC编译器进行构建了,这就要用到MSVC的命令行的工具。我这里使用的是x64 Native Tools Command Prompt for VS 2019,如下图1所示:
除此之外,MSVC的命令nmake似乎缺少像linux Make或者CMake的Configure这一步,因此,需要额外安装perl。另外,还需要安装NASM作为汇编器,一般使用这个是为了获得指令集级别的性能优化。安装好这两个程序之后,一般会自动在Path环境变量中增加相应的可执行程序位置。如果没有添加成功,就手动添加一下。当你在CMD终端中分别输入:
perl -version
nasm -v
有相应的版本号出现的时候,就说明正确安装并且能被系统所识别了,如下所示:
C:\Users\Charlee>perl -version
Locale 'Chinese (Simplified)_China.936' is unsupported, and may crash the interpreter.
This is perl 5, version 38, subversion 2 (v5.38.2) built for MSWin32-x64-multi-thread
Copyright 1987-2023, Larry Wall
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 https://www.perl.org/, the Perl Home Page.
C:\Users\Charlee>nasm -v
NASM version 2.16.01 compiled on Jun 1 2023
由于MSVC的命令行工具是基于CMD终端的,也就是使用不了更方便的Powershell终端。这里给出完整的构建bat脚本如下所示,读者需要注意跟自己的环境相适配,并修改相应的设置值:
@echo off
REM 区域设置
set LC_ALL=C
set LANG=C
REM 配置 Visual Studio 版本
SET VS_VERSION=2019
SET VS_EDITION=Enterprise
REM 配置架构(x64 或 x86)
SET TARGET_ARCH=x64
REM 设置 OpenSSL 源码目录和目标目录
SET OPENSSL_SRC_DIR=../Source/openssl-openssl-3.4.0
SET OPENSSL_INSTALL_DIR=%GISBasic%
REM 启动 Visual Studio 的开发者命令行环境
CALL "C:\Program Files (x86)\Microsoft Visual Studio\%VS_VERSION%\%VS_EDITION%\VC\Auxiliary\Build\vcvarsall.bat" %TARGET_ARCH%
IF ERRORLEVEL 1 (
echo Failed to configure Visual Studio environment.
EXIT /B 1
)
REM 进入 OpenSSL 源码目录
CD /D %OPENSSL_SRC_DIR%
REM 配置 OpenSSL
perl Configure VC-WIN64A --prefix=%OPENSSL_INSTALL_DIR% --release
IF ERRORLEVEL 1 (
echo Configuration failed.
EXIT /B 1
)
REM 构建 OpenSSL
nmake
IF ERRORLEVEL 1 (
echo Build failed.
EXIT /B 1
)
REM 测试构建
REM nmake test
REM IF ERRORLEVEL 1 (
REM echo Tests failed.
REM EXIT /B 1
REM )
REM 安装到目标目录
nmake install
IF ERRORLEVEL 1 (
echo Installation failed.
EXIT /B 1
)
echo Build and installation successful!
EXIT /B 0
根据笔者的实际测试,OpenSSL提供的构建选项虽然多,但是只有--prefix=%OPENSSL_INSTALL_DIR% --release
是生效的,好在release模式也能生成pdb文件,能够满足我的需求了。另外nmake test这一步可以省略,测试构建这一步非常慢。
2.2 Linux环境
在Linux环境下构建OpenSSL就相对简单了,我这里使用的Ubuntu20.4,构建安装到GISBasic环境变量指定的目录中,具体脚本如下:
#!/bin/bash
BuildDir="./openssl-openssl-3.4.0"
InstallDir=$GISBasic
# 加载环境变量文件
source /etc/environment
# 解压缩
unzip -q -o "../Source/openssl-openssl-3.4.0.zip" -d "../Source"
# 检查构建目录是否存在
if [ -d "$BuildDir" ]; then
rm -rf "$BuildDir" # 目录存在,删除它
fi
# 创建构建目录
mkdir -p "$BuildDir"
cd "../Source/openssl-openssl-3.4.0"
./Configure --openssldir=$BuildDir --prefix=$InstallDir --release
make
make install
在Openssl的官方文档中提供了非常多的构建配置选项,笔者这里也没有使用太多,后续有需要再进行修改吧。
3. 使用方式
虽然Openssl并没有提供CMake的编译方式,但是构建完成后却提供了OpenSSLConfig.cmake配置文件,能够被CMake正常识别引入。只需要再CMakeList.txt文件中使用如下语句:
find_package(OpenSSL REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL)
target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::Crypto)
就可以在我们的主执行程序中使用OpenSSL了。关于这一步读者如果不太理解可以参考一下笔者前面的文章《CMake构建学习笔记15-组建第一个程序项目》。
另外,OpenSSL还提供了一个可执行程序,通过这个可执行程序可以创建一个SSL证书。虽然这个创建的证书是自己给自己签发的,不能被浏览器安全认证,但是可以用来做测试https通信。第一步是创建私钥:
openssl genrsa -out server.key 2048
这将在当前目录下生成一个名为server.key的2048位RSA私钥。接下来是生成证书签名请求:
openssl req -new -key server.key -out server.csr
按照提示,输入证书信息。比较关键的是要将Common Name配置程服务器域名或IP地址。如果是本地测试,就填写 localhost。最后就是生成一个有效期为365天的自签名证书server.crt:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
CMake构建学习笔记19-OpenSSL库的构建的更多相关文章
- Ext.Net学习笔记19:Ext.Net FormPanel 简单用法
Ext.Net学习笔记19:Ext.Net FormPanel 简单用法 FormPanel是一个常用的控件,Ext.Net中的FormPanel控件同样具有非常丰富的功能,在接下来的笔记中我们将一起 ...
- SQL反模式学习笔记19 使用*号,隐式的列
目标:减少输入 反模式:捷径会让你迷失方向 使用通配符和未命名的列能够达到减少输入的目的,但是这个习惯会带来一些危害. 1.破坏代码重构:增加一列后,使用隐式的Insert插入语句报错: 2.查询中使 ...
- golang学习笔记19 用Golang实现以太坊代币转账
golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...
- springmvc学习笔记(19)-RESTful支持
springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...
- 【学习笔记】开源库之 - sigslot (在解决浅拷贝问题的基础上增加信号拦截功能)
前言说明 在文中<[学习笔记]开源库之 - sigslot (提供该库存在对象拷贝崩溃问题的解决方案)>已经介绍过 sigslot ,此文主要应用在实际的工作项目中时,发现会有拦截信号的需 ...
- https学习笔记三----OpenSSL生成root CA及签发证书
在https学习笔记二,已经弄清了数字证书的概念,组成和在https连接过程中,客户端是如何验证服务器端的证书的.这一章,主要介绍下如何使用openssl库来创建key file,以及生成root C ...
- iOS学习笔记16-数据库SQLite
一.数据库 在项目开发中,通常都需要对数据进行离线缓存的处理,如新闻数据的离线缓存等.离线缓存一般都是把数据保存到项目的沙盒中.有以下几种方式: 归档:NSKeyedArchiver 偏好设置:NSU ...
- SpringCloud学习笔记(6):使用Zuul构建服务网关
简介 Zuul是Netflix提供的一个开源的API网关服务器,SpringCloud对Zuul进行了整合和增强.服务网关Zuul聚合了所有微服务接口,并统一对外暴露,外部客户端只需与服务网关交互即可 ...
- Java学习笔记之使用反射+泛型构建通用DAO
PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...
- [原创]java WEB学习笔记19:初识MVC 设计模式:查询,删除 练习(理解思想),小结 ,问题
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- template<> 模板特化
template<> 是用于 模板特化(Template Specialization) 的一种语法. 模板特化允许你为某些特定的模板参数提供不同的实现.例如,template<&g ...
- USB协议详解第2讲(协议核心学习要点)
USB协议详解第2讲(协议核心学习要点) 看了这么多概念,想必大家会问"我要学会USB协议,并且会编程,我具体要学习那些有关的内容?",这一篇我们将会讲解在学习USB协议中务必要掌 ...
- Python | os.path.join() method
Python中的os.path.join()方法可以连接一个或多个路径组件. 此方法将各个路径组成部分,与每个非空部分路径组成部分恰好用一个目录分隔符(" /")连接起来. 如果要 ...
- Oracle 23c 新特性实操体验优质文章汇总 | 有奖征文进行中欢迎参与
继4月3日甲骨文宣布推出免费开发者版 Oracle Database 23c后,墨天轮社区发起 "Oracle 23c 免费开发者版特性体验"有奖征文活动,邀请大家分享Oracle ...
- 墨天轮访谈 | 华为云温云博:从客户视角出发,GaussDB(for Redis)究竟“香”在哪里?
分享嘉宾:温云博 华为云数据库NoSQL团队研发工程师 整理:墨天轮社区 导读 GaussDB(for Redis)采用云原生分布式架构,完全兼容Redis协议,支持丰富数据类型. 提供数据实时持久化 ...
- 4收4发ARINC429模块
USB 2.0 Hi-Speed (480Mbits /s)* 发送通道:每路发送通道FIFO大小为511 x 32bit(CHR32904) 缓存256条发送消息(CHR32904-EX)发送FI ...
- 云原生周刊 | 2023 年热门:云 IDE、Web Assembly 和 SBOM | 2023-02-20
在 CloudNative SecurityCon 上,云原生计算基金会的首席技术官 Chris Aniszczyk 在 The New Stack Makers 播客的这一集中强调了 2023 年正 ...
- CentOS7.4 安装 11204 ASM GI 组件时:ohasd failed to start
前段时间某客户要求在CENTOS7上部署Oracle 11.2.0.4 single instance && ASM存储,遇到一个比较头疼的问题,好在已经处理完了. 在图形化执行安装程 ...
- att&ck学习笔记1
一.环境搭建 1.1环境搭建测试 最近想要开始学习内网渗透,搜集了一些教程,准备先实验一个vulnstack靶机,熟悉一下内网渗透操作再学习基础知识. 靶场下载地址:http://vulnstack. ...
- DP 详解
DP 概述 DP(Dynamic programming,全称动态规划),是一种基于分治,将原问题分解为简单子问题求解复杂问题的方法. 动态规划的耗时往往远少于朴素(爆搜)解法. 动态规划 and 递 ...