https协议支持与实现
目 录
第一章 简述
1.1、本文简述
本文以libcurl库作为https客户端,客户端在arm板上实现。libevent作为https服务器,服务器在ubuntu上实现。其中,想要实现https功能需要openssl支持,添加openssl库的编译。当使用对称或非对称算法时,需要同时支持国际算法和国密算法,而openssl-1.1.1版本虽然支持国密算法(支持国际算法),但是只提供实现,不提供解密套件。从而我们选用gmssl来代替openssl,它为openssl的分支,兼容openssl,同时支持国密算法。
1.2、环境简述
名称 |
文件名 |
下载地址 |
备注 |
Libcurl |
curl-7.67.0.tar.gz |
https://curl.haxx.se/download.html |
Libcurl源码 |
GmSSL |
GmSSL-master.zip |
GmSSL源码 |
|
Libevent |
libevent.tar.gz |
http://libevent.org/ |
Libevent源码 |
第二章 相关库的编译
2.1、源码及依赖库说明
2.2、准备工作
建立合理清晰的目录结构,非常有利于明确整个移植思路,编译全部使用root用户。
1)、建立文件夹https及其子目录(家目录为/home/southgnss)
mkdir -p ~/https mkdir -p ~/ https /0_source //存放所有源码文件 mkdir -p ~/ https /1_pc //依赖库PC版安装文件夹 mkdir -p ~/ https /2_arm //依赖库arm版安装文件夹 |
2)、有源码文件,都COPY到~/https/0_source目录
2.3、编译gmssl
Libevent与libcurl都需要gmssl的支持,根据“第一章 简述”所知,需要同时编译PC版gmssl和arm版gmssl。
2.3.1、编译PC版 gmssl
1)、进入目录/home/southgnss/https/0_source目录
2)、解压gmssl库
unzip GmSSL-master.zip |
3)、进入GmSSL-master源码文件夹进行配置
./config \ --prefix=/home/southgnss/https/1_pc/gmssl \ enable-ssl3 \ enable-ssl3-method |
4)、编译并安装
make make install |
2.3.2、交叉编译 gmssl
1)、在目标目录GmSSL-master下
make clean |
2)、重新配置
export CC=/usr/local/arm/4.4.3/bin/arm-linux-gcc export CXX=/usr/local/arm/4.4.3/bin/arm-linux-g++ ./Configure \ --prefix=//home/southgnss/https/2_arm/gmssl \ no-asm \ shared linux-armv4 \ enable-ssl3 \ enable-ssl3-method |
3)、编译并安装
make make install |
2.4、编译libevent
1)、清除编译环境,使其不再是交叉编译环境
unset CC unset CXX |
2)、进入目录/home/southgnss/https/0_source目录
3)、可以下载源码或者直接使用git获取源码
git clone https://github.com/libevent/libevent.git 或 tar –xvf libevent.tar.gz |
4)、进入libevent配置
export PKG_CONFIG_PATH=/home/southgnss/https/1_pc/gmssl/lib/pkgconfig/ ./configure \ --prefix=/home/southgnss/https/1_pc/libevent \ CFLAGS="$(pkg-config --cflags openssl)" \ LDFLAGS="$(pkg-config --libs openssl)" |
5)、编译并安装
make make install |
2.5、交叉编译libcurl
1)、进入目录/home/southgnss/https/0_source目录
2)、解压libcurl源码并进入目录
tar –xvf curl-7.67.0.tar.gz cd curl-7.67.0 |
3)、清除环境并配置
unset PKG_CONFIG_PATH ./configure \ --host=arm-linux \ --enable-shared \ --enable-static \ --prefix=/home/southgnss/https/2_arm/gmssl_curl \ --with-ssl=/home/southgnss/https/2_arm/gmssl \ CC=/usr/local/arm/4.4.3/bin/arm-linux-gcc \ CXX=/usr/local/arm/4.4.3/bin/arm-linux-g++ |
4)、编译并安装
make make install |
第三章 生成证书
同时支持国际算法和国密算法,本章讲解生成两种算法的证书。因为libcurl只支持pem格式证书,所以生成的证书格式全为pem格式。
3.1 准备工作目录
创建证书环境,进入准备工作。openssl_key为国际证书目录,gmssl_key为国密证书目录。
mkdir /home/southgnss/https/openssl_key mkdir /home/southgnss/https/openssl_key/CA mkdir /home/southgnss/https/openssl_key/server mkdir /home/southgnss/https/openssl_key/client mkdir /home/southgnss/https/gmssl_key mkdir /home/southgnss/https/ gmssl _key/CA mkdir /home/southgnss/https/ gmssl _key/server mkdir /home/southgnss/https/ gmssl _key/client |
3.2 生成国际算法证书
测试证书请参考“2_参考证书->国际证书”
3.2.1、生成CA证书
1)、生成根证书私钥(pem文件)
cd /home/southgnss/https/openssl_key/CA gmssl genrsa -out cakey.pem 2048 |
2)、生成根证书签发申请文件(csr文件)
gmssl \ req \ -new \ -key cakey.pem \ -out ca.csr \ -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=southgnss/OU=system2/CN=myCA" |
3)、自签发根证书(pem文件)
gmssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey cakey.pem -in ca.csr -out cacert.pem |
3.2.2、生成服务器证书
1)、生成服务端私钥
cd /home/southgnss/https/openssl_key/server gmssl genrsa -out serverkey.pem 2048 |
2)、生成证书请求文件
gmssl \ req \ -new \ -key serverkey.pem \ -out server.csr \ -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=southgnss/OU=system2/CN=myServer" |
3)、使用根证书签发服务端证书
gmssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ../CA/cacert.pem -CAkey ../CA/cakey.pem -CAserial ca.srl -CAcreateserial -in server.csr -out servercert.pem |
4)、使用CA证书验证server端证书,显示“OK”则成功
gmssl verify -CAfile ../CA/cacert.pem servercert.pem |
3.2.3、生成客户端证书
1)、生成客户端私钥
cd /home/southgnss/https/openssl_key/client gmssl genrsa -out clientkey.pem 2048 |
2)、生成证书请求文件
gmssl \ req \ -new \ -key clientkey.pem \ -out client.csr \ -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=southgnss/OU=system2/CN=myClient" |
3)、使用根证书签发客户端证书
gmssl x509 -req -days 3650 -sha1 -extensions v3_req -CA ../CA/cacert.pem -CAkey ../CA/cakey.pem -CAserial ../server/ca.srl -in client.csr -out clientcert.pem |
4)、使用CA证书验证客户端证书,显示“OK”则成功
gmssl verify -CAfile ../CA/cacert.pem clientcert.pem |
3.3 生成国密算法证书
测试证书请参考“2_参考证书->国密证书”
3.3.1、生成CA证书
1)、生成根证书私钥(pem文件)
cd /home/southgnss/https/gmssl_key/CA gmssl ecparam -genkey -name sm2p256v1 -text -out cakey.pem |
2)、生成根证书签发申请文件(csr文件)
gmssl \ req \ -new \ -key cakey.pem \ -out ca.csr \ -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=southgnss/OU=system2/CN=myCA" |
3)、自签发根证书(pem文件)
gmssl x509 -req -days 3650 -sm3 -in ca.csr -signkey cakey.pem -out cacert.pem |
3.3.2、生成服务器证书
1)、生成服务端私钥
cd /home/southgnss/https/ gmssl _key/server gmssl ecparam -genkey -name sm2p256v1 -text -out serverkey.pem |
2)、生成证书请求文件
gmssl \ req \ -new \ -key serverkey.pem \ -out server.csr \ -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=southgnss/OU=system2/CN=myServer" |
3)、使用根证书签发服务端证书
gmssl x509 -req -sm3 -days 3650 -CA ../CA/cacert.pem -CAkey ../CA/private/cakey.pem -CAcreateserial -in server.csr -out servercert.pem |
4)、使用CA证书验证server端证书,显示“OK”则成功
gmssl verify -CAfile ../CA/cacert.pem servercert.pem |
3.3.3、生成客户端证书
1)、生成客户端私钥
cd /home/southgnss/https/ gmssl _key/client gmssl ecparam -genkey -name sm2p256v1 -text -out clientkey.pem |
2)、生成证书请求文件
gmssl \ req \ -new \ -key clientkey.pem \ -out client.csr \ -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=southgnss/OU=system2/CN=myClient" |
3)、使用根证书签发客户端证书
gmssl x509 -req -sm3 -days 3650 -CA ../CA/cacert.pem -CAkey ../CA/private/cakey.pem -CAcreateserial -in client.csr -out clientcert.pem |
4)、使用CA证书验证客户端证书,显示“OK”则成功
gmssl verify -CAfile ../CA/cacert.pem clientcert.pem |
第四章 测试
4.1、简介
4.2、测试步骤
1)、使用七星usb口线连接电脑和板子,虚拟机中导入该usb网卡设备,引入成功后会出现新的网卡
2)、ifconfig配置PC端网卡地址为192.168.155.x/24(测试配置的为192.168.155.213),保证与板子(192.168.155.155)可以互ping通。
3)、设置服务器运行环境(一般的ubuntu系统都有openssl库,防止冲突)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/southgnss/https/1_pc/libevent/lib:\ /home/southgnss/https/1_pc/gmssl/lib |
4)、修改server目录中Makefile,替换成自己libevent和gmssl PC版本所在的位置
图1 修改Makefile
5)、make后,将server所需证书(如下的三个)放在可执行文件同目录的openssl_key(国际证书)和gmssl_key(国密证书)目录下,目录没有则创建
图2 两种证书
6)、修改client目录下Makefile,与步骤4一样,注意库路径(选择ARM版本的gmssl)
7)、开发板可执行程序同目录下创建openssl_key(国际证书)和gmssl_key(国密证书)目录,放入两种类型的证书,与5步骤一样。三个证书为:clientkey.pem clientcert.pem cacert.pem
8)、ubuntu上先运行server,板上在运行client
9)、客户端如出现“== Info: SSL certificate problem: certificate is not yet valid”的错误,请用date命令检查板子平台时间,将时间设为当前准确时间和时区,与ubuntu一样。
注:修改代码改变证书类型(国际或国密),请修改如下代码中的路径,若为单向认证,只需要修改第一张图上内容并且客户端不需要证书。若为双向认证,客户端和服务器都需要如下所示的三个证书。
代码默认为双向认证,采用国密证书!!!
图3 服务器更改证书类型
图4 客户端更改证书类型
4.3、测试结果
如果运行成功,客户端最后打印如下:
图5 客户端成功打印信息
服务器打印如下:
图6 服务器成功打印信息
如果使用的是国际算法证书的话会打印如下,红色框内为国际算法套件:
图7 解密国际算法证书打印消息
如果使用的是国密算法证书的话会打印如下,红色框内为国密算法套件:
图7 解密国密算法证书打印消息