1. 客户端支持 gmssl
no-async
shared
客户端首先编译 gmssl
./Configure
no-asm
--prefix=$STAGING_DIR/usr --openssldir=/usr/ssl linux-mips32
--openssldir 参数表示实际使用的时候,链接的配置路径
no-async 表示关闭异步,但是实际编译会有问题,注意由于这个导致的问题,基本都可以通
过修改注释让其编译通过,实际使用不会有问题
然后编译 paho-mqtt,注意要链接 gmssl 生成的 libssl 和 libcrypto
--cross-compile-prefix=mips-openwrt-linux-
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
然后编译,此时需要指明 ssllib 的路径。我写了一个脚本放在 mosquitto 目录下
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/gmssl/lib/:$LD_LIBRARY_PATH
make clean
make
最后安装
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
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
-CAcreateserial -days 3650
# server.crt verify
##openssl verify -CAfile ca.crt
/usr/local/gmssl/bin/gmssl verify -CAfile ca.crt
-CA ca.crt -CAkey ca.key
server.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
-CAcreateserial -days 3650
# client.crt verify
##openssl verify -CAfile ca.crt
/usr/local/gmssl/bin/gmssl verify -CAfile ca.crt
-CA ca.crt -CAkey ca.key
client.crt
client.crt
4. 证书配置
客户端证书配置,pahomqtt 支持证书配置,双向校验的话需要配置 ca 的证书
服务端证书配置(双向认证)
5. 测试结果
抓包测试结果,
这些 unknown 的都是国密算法的套件
服务端选用的 0xe107
/usr/local/gmssl/bin/gmssl ciphers -V 查看套件