嵌入式arm开发板使用curl+openssl实现https通信

前言

        最近做一个项目,需要在arm开发板实现https post功能,一开始按照网上的教程,将curl库移植到arm开发板,但是发现我移植的curl不支持https,后面继续查才知道curl库默认是不支持https的,要支持的话需要在移植的时候加入openssl库。

移植环境

虚拟机:ubuntu16.04

交叉编译器:arm-linux-gnueabihf-gcc

openssl版本:1.1.1v

curl版本:7.63.0

openssl和curl的源码还有证书我已经长传至我的gitee,可以直接下载使用

openssl+curl: 嵌入式arm开发板使用curl+openssl实现https通信 (gitee.com)

源码编译

openssl编译

将openssl源码解压出来,然后进入源码目录,打开终端,输入裁剪命令

./config no-asm shared --prefix=/data1/code/openssl-arm --cross-compile-prefix=arm-linux-gnueabihf-

# --prefix:库和头文件生成路径
# --cross-compile-prefix:指定arm编译器

裁剪完后要注意,打开生成的Makefile文件,将这里的-m64去掉,不然编译会报错 

嵌入式arm开发板使用curl+openssl实现https通信_第1张图片

接着直接编译和安装

make -j4 & make install

curl编译

同样的,将源码解压出来,裁剪

./configure --prefix=/data1/code/curl-arm --host=arm-linux-gnueabihf CC=arm-linux-gnueabihf-gcc CXX=arm-linux-gnueabihf-g++  --with-ssl=/data1/code/openssl-arm

# --prefix:库和头文件生成路径
# --host:指定arm编译器
# --with-ssl:支持https,这里直接填写上面openssl的生成路径

要注意的是,裁剪完后,会有提示信息,这里ssl support 为enabled即表示成功添加https支持,如果没有的话即使编译成功出来也无法https连接(注意所有源码编译路径不要有中文,我一开始放在中文路径编译,ssl support一直是no,后面换成没有中文的路径居然就可以了)

嵌入式arm开发板使用curl+openssl实现https通信_第2张图片

 接着就是执行编译安装

make -j4 & make install

实际应用

先用生成的在curl的安装目录bin下找到可执行文件,将其放到arm开发板

嵌入式arm开发板使用curl+openssl实现https通信_第3张图片

接着将openssl和curl安装路径下的lib文件也一起打包放到开发板(如果要节省空间就只打包动态库即可,so文件,编译的时候没关系,编译器优先链接动态库),注意,一定要打包,因为库文件有链接属性,如果直接复制会丢失链接属性,放到开发板后需要给设置环境变量,不然找不到库。

这个时候还无法执行程序,还需要证书文件,直接去官网下载,并放到开发板,设置环境变量

export CURL_CA_BUNDLE=/opt/cafile/cert.pem

接着执行命令

./curl -h|grep ssl

出现以下内容就说明可以支持https了 

嵌入式arm开发板使用curl+openssl实现https通信_第4张图片

 最后试着使用https post百度

./curl "https://www.baidu.com"

 出现以下内容就表示没问题了

嵌入式arm开发板使用curl+openssl实现https通信_第5张图片

 代码实现

直接用这个代码,编译的时候链接openssl和curl的头文件和库文件,然后放在板子执行,效果是一样的。

#include 
#include 
#include 
#include "curl/curl.h"

int main(void)
{
    CURL *curl;
    CURLcode res;

    curl_global_init(CURL_GLOBAL_ALL);
    /* get a curl handle */
    curl = curl_easy_init();

    if (!curl) {
        return -1;
    }
    // 设置要访问的URL
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com");

    /* specify we want to POST data */
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "");

    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
	curl_easy_setopt(curl, CURLOPT_CAINFO, "/opt/cafile/cacert.pem");

    curl_easy_setopt (curl,CURLOPT_TIMEOUT, 60L);
    curl_easy_setopt (curl,CURLOPT_CONNECTTIMEOUT, 10L);

    /*执行数据请求*/
    res = curl_easy_perform(curl);
    if(res !=CURLE_OK)
    {
        fprintf(stderr, "curl_easy_perform() failed: %s\n",
            curl_easy_strerror(res));
    }

    // 释放资源
    curl_easy_cleanup(curl);
    curl_global_cleanup();

    return 0;
}

希望我的文章对你有帮助!!!

你可能感兴趣的:(arm开发,https,ubuntu,网络,linux,arm)