【OpenSSL 之一】OpenSSL初体验(编译安装、工作机制、Engine加载(afalg、cryptodev-linux)、offload等)
OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现SSL协议。整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto。
1. 简介
OpenSSL是一个安全套接字层密码库,囊括主要的密码算法、常用密钥、证书封装管理功能及实现SSL协议。整个软件包大概可以分成三个主要的功能部分:SSL协议库libssl、应用程序命令工具以及密码算法库libcrypto。
OpenSSL项目是一个开放源代码安全项目,它的目标是开发一个健壮的、商业级的、完整的开放源代码的工具包,用强大的加密算法来实现安全的Socket层(Secure Sockets Layer,SSL v2/v3)和传输层的安全性(Transport Layer Security,TLS v1)。它包含了完整的加密算法,数字签名算法及证书算法等。可以很好地保证数据的完整,保密和正确性。OpenSSL可以和于商业用途,但是使用者应该考虑自己所使用的算法有没有受到本国专利的限制以及考虑是否符合国家制定的标准。
2. 编译安装
下面主要介绍通过编译源码的方式安装OpenSSL的步骤。
1. 获取源码
源码下载地址:https://github.com/openssl/openssl
本文安装的OpenSSL的版本为openssl-1.1.1h
,大家可以根据实际需求下载合适的版本,以下的安装步骤都是通用的。
2. 执行config配置文件
进入OpenSSL源码目录执行如下命令:
./config shared --prefix=/usr/local/jack/openssl-1.1.1h --openssldir=ssl --debug -Wl,-rpath=/usr/local/jack/openssl-1.1.1h/lib
参数 | 说明 |
---|---|
shared | 表示将OpenSSL编译为共享库 |
–prefix=DIR | The top of the installation directory tree. Defaults are:/usr/local,为了不影响Ubuntu自带的OpenSSL,自定义了一个安装目录:/usr/local/jack/openssl-1.1.1h |
–openssldir=DIR | Directory for OpenSSL configuration files, and also the default certificate and keystore. Defaults are:/usr/local/ssl |
–debug | Build OpenSSL with debugging symbols and zero optimization level |
-rpath | 指定动态库的路径 |
3. 编译
make -j4 # -j4表示通过4个CPU核进行编译
4. 安装
# 选择下面的一种安装方式即可
make install # 完全安装
make install_sw # 仅安装软件,不安装说明文档等等
5. 修改环境变量
由于我们的安装路径是自定义的,虽然我们已经将OpenSSL安装到了 /usr/local/jack/openssl-1.1.1h
目录下了,但是其它的库在搜索OpenSSL时依然默认去 /usr/local
(系统自带的OpenSSL的默认安装路径)目录下去查找,为此必须修改环境变量,指定OpenSSL的搜索路径。
vi ~/.bashrc /* 打开文件,添加如下两条环境变量 */
export PATH=/usr/local/jack/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/jack/openssl/lib:$LD_LIBRARY_PATH
source ~/.bashrc
6. 安装后的交付物
[root@xxx]# tree -L 3
.
├── bin
│ ├── c_rehash
│ └── openssl
├── certs
├── ct_log_list.cnf
├── ct_log_list.cnf.dist
├── include
│ └── openssl
│ ├── ...
│ └── x509_vfy.h
├── lib
│ ├── engines-1.1
│ │ ├── capi.so
│ │ └── padlock.so
│ ├── libcrypto.a
│ ├── libcrypto.so -> libcrypto.so.1.1
│ ├── libcrypto.so.1.1
│ ├── libssl.a
│ ├── libssl.so -> libssl.so.1.1
│ ├── libssl.so.1.1
│ └── pkgconfig
│ ├── libcrypto.pc
│ ├── libssl.pc
│ └── openssl.pc
├── misc
│ ├── CA.pl
│ ├── tsget -> tsget.pl
│ └── tsget.pl
├── openssl.cnf
├── openssl.cnf.dist
├── private
└── share
├── doc
│ └── openssl
└── man
├── ...
└── man7
17 directories, 124 files
- bin
- openssl:可执行程序
- lib
- libcrypto:CRYPTO组件
- libssl:SSL组件
- lib/engines-1.1:目录下面的所有so文件都是一个engine,这些engines是在运行时动态加载的
- private
- 空目录,用于存放用户的私钥
- certs
- 空目录,用于存放用户的证书文件
- .openssl.cnf
- 配置文件,这个文件是 OpenSSL 的默认配置文件, 所有使用 OpenSSL 的 APP 都被这个配置文件控制
7. 总结
/* 第1步:拉取OpenSSL源码 */
git clone https://github.com/openssl/openssl.git
/* 第2步:自定义编译OpenSSL */
cd openssl /* 进入OpenSSL源码目录 */
./config shared --prefix=/usr/local/jack/openssl --openssldir=ssl --debug -Wl,-rpath=/usr/local/jack/openssl/lib /* 自定义配置 */
make -j4 /* 编译 */
make -j4 install /* 安装 */
ldd ./apps/openssl /* 查询刚刚编译出来的openssl所依赖的库 */
/* 第3步:修改环境变量 */
vi ~/.bashrc /* 打开文件,添加如下两条环境变量 */
export PATH=/usr/local/jack/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/jack/openssl/lib:$LD_LIBRARY_PATH
source ~/.bashrc
# shared:表示将OpenSSL编译为共享库
# --prefix=DIR:指定OpenSSL的安装路径,默认路径是:/usr/local,上边的自定义安装路径为:/usr/local/jack/openssl
# --openssldir=DIR:指定OpenSSL的配置文件、证书、秘钥的路径,默认路径为:/usr/local/ssl,上边的自定义配置的路径为:ssl(/usr/local/jack/openssl/ssl)
# --debug:编译OpenSSL时,添加调试符号
# -rpath=DIR:指定动态库的路径,上边配置的动态库路径为:/usr/local/jack/openssl/lib
3. 工作机制
如上,两个图通过不同的维度表达了同样的事情, 我们目前只关心第一个图,通过上图可以看出OpenSSL主要由4部分组成:APP、TLS、CRYPTO、ENGINE。
- APP就是一组命令行工具,它们被集成在二进制文件/bin/openssl中,可以通过不同的参数进行调用。APP主要是对TLS与CRYPTO的使用
- LS表现为一组API,用于操作SSL Socket。TLS库是对CRYPTO的封装,使用EVP接口,EVP模块使用BIO接口
- CRYPTO是加密组件的集合,对加密逻辑的抽象,可使用软算法,也可以使用ENGINE进行算法卸载,完成密码功能,其中两个重要的核心组件分别是EVP(envelope)和BIO(BASIC INPUT OUTPUT)
- ENGINE是提供加密能力的一组引擎,插件式整合在框架内。在使用中可以对不同的算法指定不同的加密引擎
3. 引擎 Engine
在OpenSSL的0.9.6版之前,OpenSSL是将普通版本跟支持Engine的版本分开的,到了OpenSSL的0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。
Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用的加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备与OpenSSL协调工作,需要写少量的接口代码(我们的 ccat_engine 就是这种类型的引擎)。
引擎(engine)在OpenSSL安装路径的位置为:/openssl/lib/engines-1.1/
(其中**代表了OpenSSL的实际安装路径)。
如上图所示,主要介绍3种引擎:qat_engine、af_alg、devcrypto。
3.1 qat_engine
若想测试该引擎,那必须有一个Intel对应的板卡才行。我们实际在开发中时对qat_engine进行了适当的修改,是指能过正常运行在我们的板卡上了,由于没有板卡,这里进行初步说一下,qat_engine的下载,编译过程。
(1)在github上拉取QAT_Engine的源码文件,网址为:https://github.com/intel/QAT_Engine.git
(2)编译流程如下:
./autogen.sh
./configure \
--enable-qat_debug \
--enable-qat_warnings \
--enable-qat_mem_debug \
--enable-qat_mem_warnings \
--enable-qat_cycle_counts \
--with-qat_dir=/home/jack/qat \
--with-openssl_dir=/home/jack/openssl-1.1.1h \
--with-openssl_install_dir=/usr/local/jack/openssl-1.1.1h
make clean
make -j4
make install
至此,在OpenSSL安装路径的位置为:**/openssl/lib/engines-1.1/
**中就会出现名为qatengine.so
的引擎。
测速命令如下:
openssl speed -async_jobs 1 -engine qatengine -evp aes-128-cbc -multi 1
3.2 af_alg
af_alg引擎通过NetLink卸载内核算法到HSM。
af_alg是OpenSSL自带的引擎,在编译OpenSSL时默认已经将af_alg引擎编译了,若不想编译af_alg,则需在执行./config明确指定参数 “no-afalgeng
”
./config shared --prefix=/usr/local/jack/openssl --openssldir=ssl --debug -Wl,-rpath=/usr/local/jack/openssl/lib no-afalgeng
编译afalg引擎后,会生成一个单独的引擎afalg.so库文件,该文件在目录**/openssl/lib/engines-1.1/
下
测速命令如下:
openssl speed -async_jobs 1 -engine afalg -evp aes-128-cbc -multi 1
3.3 devcrypto
devcrypto引擎则是通过 /dev/crypto
通路卸载内核算法到HSM。
该引擎在OpenSSL中默认不编译的,若想编译 devcrypto 必须在执行./config 配置时明确指定参数 “enable-devcryptoeng
”,也必须依赖 cryptodev 的第三方库。
./config shared --prefix=/usr/local/jack/openssl --openssldir=ssl --debug -Wl,-rpath=/usr/local/jack/openssl/lib enable-devcryptoeng
编译完devcrypto引擎后,并不会在**/openssl/lib/engines-1.1/目录下生成一个独立的devcrypto.so文件,而是该引擎直接编译进了libcrypto.so.1.1中。
编译第三方库(cryptodev)的步骤如下:
(1)在github上拉取cryptodev的源码文件,网址为:https://github.com/cryptodev-linux/cryptodev-linux
(2)进入源码目录,执行 make
编译前:
编译后:
若想通过openssl命令调用devcrypto引擎,那么必须首先安装cryptodev.ko才行,因为openssl中编译的出来的devcrypto引擎时要依赖这个第三方库的
测速命令如下:
openssl speed -async_jobs 1 -engine devcrypto -evp aes-128-cbc -multi 1
更多推荐
所有评论(0)