MQTT——国密SSL加密
1.客户端支持gmssl
客户端首先编译gmssl
./Configure no-asm no-async shared --cross-compile-prefix=mips-openwrt-linux- --prefix=$STAGING_DIR/usr --openssldir=/usr/ssl linux-mips32
–openssldir参数表示实际使用的时候,链接的配置路径
no-async表示关闭异步,但是实际编译会有问题,注意由于这个导致的问题,基本都可以通过修改注释让其编译通过,实际使用不会有问题
然后编译paho-mqtt,注意要链接gmssl生成的libssl和libcrypto
2.服务器支持gmssl
服务器我用的centos,首先也是编译gmssl,
./Configure shared linux-x86_64 --prefix=/usr/local/gmssl
注意以后多个地方会引用这个路径,千万不要装到系统目录下。否则很麻烦。
编译之后gmssl和系统原带的openssl,会因为引用lib的路径产生冲突……
目前解决办法就是,使用gmssl的时候,就调用一句
export LD_LIBRARY_PATH=/usr/local/gmssl/lib/:$LD_LIBRARY_PATH
,意思就是让系统把gmssl的库暴露出来,一般简易在一个脚本中使用,脚本工作结束后,就无效了。
这样就不会导致系统原带openssl出现问题,要知道系统原带的openssl,关系各个部分,出现问题会导致系统瘫痪。
然后编译mosquitto,
可能需要安装一些软件
yum install gcc-c++
yum install make
yum install gcc
yum install c-ares-devel
yum -y install docbook-style-xsl( find / -name docbook.xsl,然后修改man/manpage.xsl那行)
编译过程要指定一下gmssl的头文件路径和lib路径
修改mosquitto下面的config.mk,大概124行
UNAME:=$(shell uname -s)
ifeq ($(UNAME),SunOS)
ifeq ($(CC),cc)
CFLAGS?=-O -I/usr/local/gmssl/include
else
CFLAGS?=-Wall -ggdb -O2 -I/usr/local/gmssl/include
endif
else
CFLAGS?=-Wall -ggdb -O2 -I/usr/local/gmssl/include
endif
LDFLAGS=-L/usr/local/gmssl/lib/
然后编译,此时需要指明ssllib的路径。我写了一个脚本放在mosquitto目录下
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/gmssl/lib/:$LD_LIBRARY_PATH
make clean
make
make install
3.证书制作
#!/usr/bin/env bash
# When OpenSSL prompts you for the Common Name for each certificate, use different names.
export LD_LIBRARY_PATH=/usr/local/gmssl/lib/:$LD_LIBRARY_PATH
# CA key
##openssl genrsa -out ca.key 2048
/usr/local/gmssl/bin/gmssl ecparam -genkey -name sm2p256v1 -out ca.key
# CA csr
##openssl req -new -subj "/CN=ca" -key ca.key -out ca.csr
/usr/local/gmssl/bin/gmssl req -new -subj "/CN=ca" -key ca.key -out ca.csr
# CA crt
##openssl x509 -req -in ca.csr -out ca.crt -signkey ca.key -days 3650
/usr/local/gmssl/bin/gmssl x509 -req -in ca.csr -out ca.crt -signkey ca.key -days 3650
# server key
##openssl genrsa -out server.key 2048
/usr/local/gmssl/bin/gmssl ecparam -genkey -name sm2p256v1 -out server.key
# server.csr
##openssl req -new -subj "/CN=server" -key server.key -out server.csr
/usr/local/gmssl/bin/gmssl req -new -subj "/CN=server" -key server.key -out server.csr
# server.crt
##openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
/usr/local/gmssl/bin/gmssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
# server.crt verify
##openssl verify -CAfile ca.crt server.crt
/usr/local/gmssl/bin/gmssl verify -CAfile ca.crt server.crt
# client key
##openssl genrsa -out client.key 2048
/usr/local/gmssl/bin/gmssl ecparam -genkey -name sm2p256v1 -out client.key
# client.csr
##openssl req -new -subj "/CN=client" -key client.key -out client.csr
/usr/local/gmssl/bin/gmssl req -new -subj "/CN=client" -key client.key -out client.csr
# client.crt
##openssl x509 -req -in client.csr -out client.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
/usr/local/gmssl/bin/gmssl x509 -req -in client.csr -out client.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 3650
# client.crt verify
##openssl verify -CAfile ca.crt client.crt
/usr/local/gmssl/bin/gmssl verify -CAfile ca.crt client.crt
4.证书配置
客户端证书配置,我的代码为c语言版本pahomqtt,支持证书配置,双向校验的话需要配置ca的证书
服务端证书配置(双向认证)
5.测试结果
抓包测试结果,
这些unknown的都是国密算法的套件
服务端选用的0xe107
/usr/local/gmssl/bin/gmssl ciphers -V查看套件
证明选择的是国密算法。