ARM平台移植openssl1.1.1g

1.openssl简介

在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。

2.开发环境

Ubuntu20.04

openssl源码,下载地址: https://www.openssl.org/source/old/ ,我这里下载的是openssl-1.1.1g版本。

3.编译

使用 tar zxvf openssl-1.1.1g.tar.gz 解压,并通过 cd tar zxvf openssl-1.1.1g.tar.gz 进入目标文件夹。

接下来就是配置 config 文件生成Makefile,由于新版本的openssl变化较大,交叉编译时配置比较麻烦,所以交叉编译时采用 Configure 自定义配置。

X86平台

通过 mkdir build 创建安装文件夹,到时候生成的头文件、库文件存放于此。

通过如下命令生成Makefile文件:

1
./config  --prefix=$(pwd)/build

prefix 表示安装路径,即上面创建的文件夹。

运行完之后会提示成功字样,这时文件夹多出了一个Makefile文件。

然后编译,这里的 -j4 是4核同时编译的意思,能够加快编译速度。

1
make -j4

编译完之后,执行如下命令将编译好的文件安装到上面指定的文件夹。

1
make install

这时去build文件中就能看到生成好的库文件和头文件,在不指定的情况下,会同时生成静态库和动态库。

ARM平台

通过 mkdir build-arm 创建安装文件夹,到时候生成的头文件、库文件存放于此。

通过如下命令生成Makefile文件:

1
./Configure linux-generic32 no-asm no-async --prefix=$(pwd)/build-arm CROSS_COMPILE=arm-linux-

linux-generic32 表示标准32位Linux。

no-asm 表示在交叉编译过程中不使用汇编代码加速编译过程,原因是它的汇编代码是对arm格式不支持。

no-async 表示没有提供GNU C的ucontext库,arm-linux-gcc编译器不含GNU C的ucontext库,如果不指定,最后有些tools找不到对应函数,导致编译报错。

prefix 表示安装路径,即上面创建的文件夹。

CROSS_COMPILE 表示编译器,例如我用到的是arm-linux-gcc, 这里只需要输入arm-linux- 即可。

运行完之后会提示成功字样,这时文件夹多出了一个Makefile文件。

然后编译,这里的 -j4 是4核同时编译的意思,能够加快编译速度。

1
make -j4

如果之前编译过,再编译会报错,只需要执行make clean命令再编译即可。

编译完之后,执行如下命令将编译好的文件安装到上面指定的文件夹。

1
make install

这时去build-arm文件中就能看到生成好的库文件和头文件,在不指定的情况下,会同时生成静态库和动态库。


4.验证

我这里选择在X86平台验证一下SHA1算法,不同平台在使用openssl上几乎无差异。

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
#include <openssl/sha.h>

int main ()
{<!-- -->
    int i;
    char c[] = "hello world";
    unsigned char hash[20];

    SHA1(c, strlen(c), hash);

    for (i = 0; i < 20; i++)
        printf ("%.2x", hash[i]);

    printf ("\n");

    return 0;
}

使用动态库时,只要调用 sslcrypto 库即可,必须 ssl 在前,不然会报错。

在使用静态库时,还需要调用 pthreaddl 库,必须在sslcrypto 后调用。

运行结果:

2aae6c35c94fcfb415dbe95f408b9ce91ee846ed