https在linux下的使用,以及arm平台上的使用…

ubuntu下的调用

安装

sudo apt-get install libcurl4-openssl-dev

默认安装目录:/usr/include/curl/

测试:

1
curl https://www.baidu.com

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// https.cpp
#include <stdio.h>
#include <curl/curl.h>

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

curl_global_init(CURL_GLOBAL_DEFAULT);

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com/");

/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));

/* always cleanup */
curl_easy_cleanup(curl);
}

curl_global_cleanup();

return 0;
}
1
2
g++ https.cpp -o https
./https

arm板上curl移植

因为要支持https需要移植openssl和curl。其中要注意只有在curl加入openssl才能支持https。

openssl移植

开发环境:
- ubuntu18.04
- 交叉编译器:arm-himix200-linux-

移植步骤:

  1. OpenSSL官网下载最新源码;
  2. 解压缩:tar zxvf openssl-1.1.1g.tar.gz
  3. 执行:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    cd openssl-1.1.1g
    mkdir build_hisimix200
    ./Configure --prefix=$PWD/build_hisimix200 --cross-compile-prefix=arm-himix200-linux- no-asm shared linux-armv4 -march=armv7-a -D__ARM_MAX_ARCH__=7

    # no-asm:是在交叉编译过程中不使用汇编代码代码加速编译过程,原因是它的汇编代码是对arm格式不支持的。
    # shared :生成动态连接库。
    # --prefix :指定make install后生成目录的路径,不修改此项则默认为OPENSSLDIR目录(/usr/local/ssl)。
    # setarch i386:声明生成的是32位CPU,如果是64位CPU则去除该部分。
    # CROSS_COMPILE:设置交叉编译器,注意,在这之前保证该编译器已经设置好环境变量
    # shared后面的参数,到arm开发板上,输入:`cat /proc/cpuinfo`
    我的cpuinfo:
    cpuinfo
  4. 修改Makefile(海思芯片跳过此步骤):
    1
    删除 CFLAG= 中的-m64
  5. 执行下面命令,编译OpenSSL库:
    1
    make
  6. 执行下面命令,将编译好的库文件拷贝到指定目录:
    1
    make install
  7. include下文件在编译程序的时候需要指定include的路径。而lib下在程序运行时会用到,需要将lib下文件拷贝到开发板中。在项目的Makefile文件里头加入openssl的头文件和库文件的声明,此时需要注意引用库的顺序为:-lssl -lcrypto,如果为 -lcrypto -lssl就会编译错误。
  • 查询pem或crt等证书文件有效日期:openssl x509 -in <证书请求文件> -noout -dates
  • 查询证书内容:openssl x509 -in cert.pem -noout -text
  • 打印证书序列号:openssl x509 -in cacert.pem -noout -serial
  • 打印出证书的拥有者名字:openssl x509 -in cert.pem -noout -subject
  • 以RFC2253规定的格式打印出证书的拥有者名字:openssl x509 -in cert.pem -noout -subject -nameopt RFC2253
  • 在支持UTF8的终端一行过打印出证书的拥有者名字:openssl x509 -in cert.pem -noout -subject -nameopt oneline -nameopt -escmsb
  • 打印出证书的MD5特征参数:openssl x509 -in cert.pem -noout -fingerprint

curl移植

开发环境:
- Ubuntu 18.04
- 交叉编译:arm-himix200-linux-
- curl-7.73.0.tar.gz

移植步骤:

  1. 下载最新源码curl-7.73.0.tar.gz;
  2. 解压缩:
    1
    2
    tar zxvf curl-7.73.0.tar.gz
    cd curl-7.73.0
  3. 执行下面指令,做相应的配置:
    1
    2
    3
    4
    mkdir build_hisimix200
    ./configure --prefix=$PWD/build_hisimix200 CC=arm-himix200-linux-gcc --host=arm-himix200-linux --with-ssl=/opt/hisi-linux/x86-arm/arm-himix200-linux/thirdpart/openssl_hisimix200

    # --with-ssl: 上个步骤中生成的文件的路径(***/build_hisi),我的将上个步骤的build_hisi中的所有文件复制到了/opt/hisi-linux/x86-arm/arm-himix200-linux/thirdpart/openssl_arm目录下。
    完成后注意关注ssl是否为enable状态:配置状态
    1
    2
    make
    make install
  4. 将build_hisimix200/文件夹下的所有文件拷贝到开发板上。

安装完成后,将bin文件夹中的curl拷贝到开发板,验证是否可用:

1
2
curl https://www.baidu.com -k # -k表示不验证CA证书
curl https://www.baidu.com --cacert cacert.pem # 指定证书路径
  • 如果问题请下载最新cacert.pem
  • 如果提示证书无效,可以尝试更新系统时间ntpdate

配置证书变量:

1
2
3
4
cp cacert.pem /etc/curlssl/cacert.pem
# 配置到环境变量
export CURL_CA_BUNDLE=/etc/curlssl/cacert.pem
curl -v https://www.baidu.com

使用

  • 方法一:使用静态库:从两个步骤中分别有libcurl.a,libssl.a,libcrypto.a;
  • 方法二:使用动态库:分别为libcur.so.4,libssl.so.1.1,libcrypto.so.1.1;

以下例子将包含include中的curl文件夹拷贝到与cpp同目录,如果不拷贝可以设置系统环境变量链接到放置的位置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// https.cpp
#include <iostream>
#include <stdio.h>
#include <string>
#include <sstream>

#include "curl/curl.h"

size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata) {
std::ostringstream *stream = (std::ostringstream*)userdata;
size_t count = size * nmemb;
stream->write(ptr, count);
return count;
}

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

curl_global_init(CURL_GLOBAL_DEFAULT);

curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "https://www.baidu.com/");
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
// curl_easy_setopt(curl, CURLOPT_CAINFO, "cacert.pem");
// curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
// curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
std::ostringstream stream;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &stream);

/* Perform the request, res will get the return code */
std::cout << 3 << std::endl;
res = curl_easy_perform(curl);
std::cout << "1" << std::endl;
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
else {
std::string output = stream.str();
std::cout << "get response: " << std::endl << output << std::endl;
}

/* always cleanup */
curl_easy_cleanup(curl);
}

curl_global_cleanup();

return 0;
}

另外,如使用静态库编译,加入-lpthread -ldl设置,如没有该库,另外编译即可。