OpenSSL 加密库
OpenSSL 简介
OpenSSL 是使用非常广泛的 SSL 的开源实现,并且因为其实现了 SSL 所用的各种加密算法,因此,OpenSSL 也是一个被广泛使用的加密函数库。
SSL(Secure Socket Layer)安全协议是 Netscape 公司首先提出,最初用在保护 Navigator 浏览器和 web 服务器之间的 HTTP 通信上。后来 SSL 协议成为传输层安全通信事实上的标准,并被 IETF 吸收改进为 TLS(Transport layer security)协议。
SSL/TLS 协议位于 TCP 协议和应用层协议之间,为传输双方提供认证、加密、完整性保护等安全服务。SSL 作为一个协议框架,通信双方可以选用合适的对称算法、公钥算法、MAC 算法等密码算法实现安全服务。
OpenSSL 包含了三部分:SSL 协议、密码算法库、应用程序库。SSL 协议部分完全实现和封装了 SSL 协议的三个版本和 TLS 协议,SSL 协议库的实现是在密码算法库的基础上实现的,使用该库可以建立一个 SSL 服务器和客户端。密码算法库是一个强大的密码算法库,它是 OpenSSL 的基础部分,实现了目前大部分主流的密码算法和标准。主要包含公开密钥算法、对称加密算法、散列函数算法、X509 数字证书标准、PKCS12、PKCS7 等标准。也可以将外部加密算法集成到 OpenSSL 里面,比如使用加密卡等。
应用程序部分是 OpenSSL 最生动的部分,也是 OpenSSL 使用入门部分。基于上述密码算法库和 SSL 协议库实现了很多实用和范例性的应用程序,涵盖了众多的密码学应用。主要包含了各种密码算法的加密程序、各种密钥的产生程序、SSL 连接测试程序及其他标准的应用程序。
OpenSSL 应用方式包含以下两种:
- 基于 OpenSSL 指令的应用,比如创建 CA 证书。
- 基于 OpenSSL 加密库和协议库的应用。
基于 OpenSSL 库的应用相比基于 OpenSSL 指令的应用工作量会大很多,但 OpenSSL 的应用绝大多数是基于 OpenSSL 库的方式,基于 OpenSSL 库的应用可以根据需求进行灵活选择,而不必受到 OpenSSL 指令限制。
OpenSSL 库移植
OpenSSL 的移植需要在 Linux 下完成。在进行本节工作前需要先建立 SylixOS 在 Linux 下的编译环境,参考 SylixOS 百科“Linux 环境开发指南”完成。
从 OpenSSL 的官方网站 http://www.openssl.org/ 下载 OpenSSL 源文件,将文件中的内容拷贝到 SylixOS 的工作空间目录下。
<linux>$ cd /home/user/sylixos_workspace /* 进入 sylixos 工作空间 */
<linux>$ tar zxvf openssl-1.0.2a.tar.gz /* 解压 OpenSSL */
<linux>$ mv openssl-1.0.2a openssl /* 修改 OpenSSL 目录名 */
<linux>$ cd openssl /* 进入 OpenSSL 目录 */
配置 OpenSSL 开源版 ARM 工具链:
<linux>$ ./configure linux-armv4 -D__ARM_MAX_ARCH__=8 -cross-compile-prefix=arm-none-eabi- no-asm shared --prefix=/opt/arm-sylixos-openssl
Makefile 加入如下内容,SYLIXOS_BASE_PATH 工程路径根据实际情况修改:
SYLIXOS_BASE_PATH=/home/user/sylixos_workspace/sylixos-base
INCDIR = $(SYLIXOS_BASE_PATH)/libsylixos/SylixOS
INCDIR += $(SYLIXOS_BASE_PATH)/libsylixos/SylixOS/include
INCDIR += $(SYLIXOS_BASE_PATH)/libsylixos/SylixOS/include/inet
SHLDIR = $(SYLIXOS_BASE_PATH)/libsylixos/Debug
SHLDIR += $(SYLIXOS_BASE_PATH)/libcextern/Debug
SYLIXOS_CFLAGS=-DSYLIXOS -DSYLIXOS_LIB $(addprefix -I,$(INCDIR)) -mcpu=arm920t -fmessage-length=0 -fno-short-enums
SYLIXOS_EXLIBS=-nostdlib $(addprefix -L,$(SHLDIR)) -lcextern -lvpmpdm -lm -lgcc
修改 CFLAG:
CFLAG = $(SYLIXOS_CFLAGS) ...
修改 PEX_LIBS 和 EX_LIBS:
PEX_LIBS = -shared
EX_LIBS = $(SYLIXOS_EXLIBS)
编译 OpenSSL:
<linux>$ make
安装 OpenSSL 需要具有超级用户权限,输入 su 切换到 root 用户:
<linux># su
修改环境变量 PATH:
<linux># export PATH=/usr/lib/gcc-arm-none-eabi/bin:$PATH
输入命令安装 OpenSSL 到指定目录/opt/arm-sylixos-openssl:
<linux># make install
部署 OpenSSL 到 SylixOS 目标板的/lib 目录下的 openssl 目录中,然后将 make install 的结果(位于/opt/arm-sylixos-openssl 目录)上传到 SylixOS 目标板的/lib/openssl 目录。
执行以下命令,完成 OpenSSL 的相关配置:
# cd /lib/openssl/lib /* 创建符号链接 */
# ln -s libssl.so.1.0.0 libssl.so
# ln -s libcrypto.so.1.0.0 libcrypto.so
# PATH=$PATH:/lib/openssl/bin /* 修改环境变量 */
# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib/openssl/lib
# varsave
OpenSSL 库验证
在 SylixOS 设备的控制台上输入 openssl x(x 是任意字符),控制台会输出当前 OpenSSL 支持的指令。
# openssl x
openssl:Error: 'x' is an invalid command.
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand req
rsa rsautl s_client s_server
s_time sess_id smime speed
spkac srp ts verify
version x509
Message Digest commands (see the `dgst' command for more details)
md4 md5 mdc2 rmd160
sha sha1
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 seed seed-cbc seed-cfb
seed-ecb seed-ofb
输入 openssl version 输出当前 OpenSSL 的版本号:
# openssl version
OpenSSL 1.0.2a 19 Mar 2015