最近做一个项目,需要在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源码解压出来,然后进入源码目录,打开终端,输入裁剪命令
./config no-asm shared --prefix=/data1/code/openssl-arm --cross-compile-prefix=arm-linux-gnueabihf-
# --prefix:库和头文件生成路径
# --cross-compile-prefix:指定arm编译器
裁剪完后要注意,打开生成的Makefile文件,将这里的-m64去掉,不然编译会报错
接着直接编译和安装
make -j4 & make install
同样的,将源码解压出来,裁剪
./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,后面换成没有中文的路径居然就可以了)
接着就是执行编译安装
make -j4 & make install
先用生成的在curl的安装目录bin下找到可执行文件,将其放到arm开发板
接着将openssl和curl安装路径下的lib文件也一起打包放到开发板(如果要节省空间就只打包动态库即可,so文件,编译的时候没关系,编译器优先链接动态库),注意,一定要打包,因为库文件有链接属性,如果直接复制会丢失链接属性,放到开发板后需要给设置环境变量,不然找不到库。
这个时候还无法执行程序,还需要证书文件,直接去官网下载,并放到开发板,设置环境变量
export CURL_CA_BUNDLE=/opt/cafile/cert.pem
接着执行命令
./curl -h|grep ssl
出现以下内容就说明可以支持https了
最后试着使用https post百度
./curl "https://www.baidu.com"
出现以下内容就表示没问题了
直接用这个代码,编译的时候链接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;
}
希望我的文章对你有帮助!!!