wolfssl移植替换openssl

本文的核心是讲怎么把项目中的openssl库替换成wolfssl库,并且尽可能的少改工程代码。

一、为什么选择wolfssl替换已有的openssl库

  1. wolfssl比较小。
    要从工程中移除openssl的最主要的一个原因是openssl太大了。在嵌入式工程中,为了实现一个小的功能,引用了一个openssl,编译生成的固件太大了,flash装不下了。而wolfssl在满足基本需求的同时,又能大大减小固件的大小。
  2. wolfssl性能相对优秀。
    和openssl对比,wolfssl的性能更加优秀,关于openssl和wolfssl的对比,可从wolfssl官网得到详尽的答案:openssl和wolfssl的特点对比
  3. wolfssl方便移植。
    wolfssl 除了本地API之外,wolfssl还提供了一个openssl兼容性头文件wolfssl/openssl/ssl.h ,以简化转换为使用wolfssl或帮助将现有的openssl应用程序移植到wolfssl。openssl兼容层将最常用的openssl命令的子集映射到wolfssl的本地API函数。这应该允许在应用程序或项目中通过wolfssl轻松替换openssl,而无需更改大量代码。

二、如何编译安装wolfssl

首先需要去官网下载安装包:wolfssl下载
或者去github上下载:wolfssl下载
学习资料和论坛都在官网上可以找到,这是wolfssl的使用手册
在PC linux系统编译:

  1. ./configure
  2. make
  3. sudo make install

./configure后面可以跟很多选项,比如指明编译链、安装路径、静态库或者动态库等。具体说明可以执行 ./configure –help
官方关于configure的说明参考:configure –help 说明链接

交叉编译链编译:
需要用–host选项来指明交叉编译链。

./configure --prefix=$PWD/output --host=arm-linux --enable-openssh --enable-static --disable-shared

需要注意的是交叉编译链路径需要加入到PATH环境变量中,不然也是找不到的。
执行configure的目的是为了生成Makefile。需要确保在当前路径有output目录,这是通过–prefix决定的,不指定将默认安装在/usr/local目录下。生成的libwolfssl.a 静态库放到工程代码中,然后修改相关Makefile将库包含进来。并且在源码中需要包含头文件

三、移植过程遇到的问题

出现如下错误信息,找不到库:

./echoserver: error while loading shared libraries: libwolfssl.so.16: cannot open shared object file: No such file or directory

有以下几种解决方法:

  1. 第一种方法 最佳解决方法:
    因为编译开源库是默认配置安装的,所以库的路径在/usr/local/lib/下,需要软链接到系统能找到库的地方,也就是系统默认库路径下
    sudo ln -s /usr/local/lib/libwolfssl.so.16.0.0 /usr/lib/libwolfssl.so.16
  2. 第二种方法
    在configure阶段用–prefix参数把安装目录指定到/usr目录下,会在/usr/include和/usr/local/lib/下生成头文件和库
    例如:./configure –prefix=/usr
  3. 第三种方法
    针对没有root权限的情况,大多数情况都是执行:
    export LD_LIBRARY_PATH=/yourlocalpath:$LD_LIBRARY_PATH
  4. 第四种方法
    可以直接加上路径名或者以 -L,-l 指定库

gcc编译时库的依赖顺序经常出现问题:

静态库经常会出现依赖顺序问题,动态库则不会。
当A库依赖于B库时(A库引用B库的函数时,应该写在前面)则在编译的时候链接顺序应该是 -lA -lB 。

虽然提供了兼容层,但是wolfssl的机制和openssl的机制还是有些不同。尝试移植wolfssl库到嵌入式板子。移植后,写的demo程序在板子上可以运行,嵌入到工程中也没有问题。但是,移植到“发送邮件“ 那部分代码,ssl_connect函数连接远程服务器不成功。发现wolfssl和openssl在证书验证机制上是有区别的。wolfssl 客户端默认需要加载证书,而openssl则不用。这意味着如果没有加载CA来验证服务器,则会出现连接错误。官网说可以调用SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0) 来模拟openssl的行为,但这将降低安全性。经过反复试验,还是连接不上。 可能客户端还是需要加载证书。看了一些wolfssl例子,客户端都是需要加载数字证书的。如果是这样的情形,那对应每种类型的邮箱所要加载的证书也不一样(如qq和163),用户绑定的邮箱种类也不可能全部一样,处理起来将会变得很麻烦。 由于目前移植存在风险,所以还是用原来的openssl库。 这是目前遗留的问题,后续再看看。

四、服务器代码

用简单的例子来模拟,可用抓包软件研究一下。
OPEN_SSL宏来控制是否要加入wolfssl机制。客户端和服务器都是不需要加载证书的,因为客户端使用了SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, 0) 函数。

//server_echo.c
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <netinet/in.h>

  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要在Linux上移植OpenSSL,首先需要准备好编译环境,比如Ubuntu 18.04-amd64,并下载OpenSSL的源代码。接下来,你需要进行编译和配置。移植过程中可能会遇到一些问题。对于i.mx6ul这样的低频Cortex-A7处理器,对于大量运算可能会有些吃力。 在编译过程中,你可能会遇到一些警告,主要是关于64位和32位不兼容问题,可以忽略这些警告。然而,一个严重的问题是arm-linux-gnueabihf-4.7编译器不提供GNU C的ucontext,这会导致一些工具找不到相应的函数,从而导致编译错误。因此,你需要使用自定义配置,而不是简单的./config配置。你可以使用./Configure命令进行自定义配置,比如./Configure linux-generic32 no-asm shared no-async --prefix=/home/xx/arm-software/arm-openssl CROSS_COMPILE=/home/xx/arm-linux-gnueabihf-4.7/bin/arm-linux-gnueabihf- CC=gcc。 移植完成后,你可以直接运行make命令进行编译。 总的来说,移植OpenSSL到Linux系统需要准备好编译环境,下载源代码,进行编译和配置,并解决可能遇到的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [openssl移植到arm-linux全过程](https://blog.csdn.net/jnjavelin/article/details/100134655)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值