在计算机网络上,OpenSSL是一个开放源代码的软件库包,应用程序可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被应用在互联网的网页服务器上。
SSL是Secure Sockets Layer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape公司在推出第一个Web浏览器的同时,提出了SSL协议标准。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。已经成为Internet上保密通讯的工业标准。
SSL能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。
Ubuntu20.04
openssl源码,下载地址: https://www.openssl.org/source/old/
,我这里下载的是openssl-1.1.1g版本。
使用 tar zxvf openssl-1.1.1g.tar.gz
解压,并通过 cd openssl-1.1.1g
进入目标文件夹。
接下来就是配置 config
文件生成Makefile,由于新版本的openssl变化较大,交叉编译时配置比较麻烦,所以交叉编译时采用 Configure
自定义配置。
通过 mkdir build
创建安装文件夹,到时候生成的头文件、库文件存放于此。
通过如下命令生成Makefile文件:
./config --prefix=$(pwd)/build
prefix
表示安装路径,即上面创建的文件夹。
运行完之后会提示成功字样,这时文件夹多出了一个Makefile文件。
然后编译,这里的 -j12
是12个进程同时编译的意思,能够加快编译速度。
make -j12
编译完之后,执行如下命令将编译好的文件安装到上面指定的文件夹。
make install
这时去build文件中就能看到生成好的库文件和头文件,在不指定的情况下,会同时生成静态库和动态库。
通过 mkdir build-arm
创建安装文件夹,到时候生成的头文件、库文件存放于此。
通过如下命令生成Makefile文件:
./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文件。
然后编译,这里的 -j12
是12个进程同时编译的意思,能够加快编译速度。
make -j12
如果之前编译过,再编译会报错,只需要执行make clean
命令再编译即可。
编译完之后,执行如下命令将编译好的文件安装到上面指定的文件夹。
make install
这时去build-arm文件中就能看到生成好的库文件和头文件,在不指定的情况下,会同时生成静态库和动态库。
我这里选择在X86平台验证一下SHA1算法,不同平台在使用openssl上几乎无差异。
直接上代码:
#include
#include
#include
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;
}
使用动态库时,只要调用 ssl
和 crypto
库即可,必须 ssl
在前,不然会报错。
在使用静态库时,还需要调用 pthread
和 dl
库,必须在ssl
和 crypto
后调用。
运行结果:
2aae6c35c94fcfb415dbe95f408b9ce91ee846ed