建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

fangzhirui

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-7 16:15:05 747 5 楼主 显示全部楼层
[服务教程] DIS-IoT接入实例在MQTT SSL双向认证下测试消息接收和发送

IoT接入作为支持多种物联网协议(如:MQTT、STOMP、WebSocket、CoAP)的消息网关,可以快速方便的采集各种物联网设备数据,实现设备对云端数据的订阅,支持数据转储到DIS通道,从而实现对数据的应用和实时处理。

1. OS

[root@fangzhirui02-huawei-123 tmp]# cat /etc/redhat-release 
CentOS Linux release 7.4.1708 (Core)
[root@fangzhirui02-huawei-123 tmp]# uname -a
Linux fangzhirui02-huawei-123 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

2. 安装erlang

1.官网下载源代码包, 名字类似于otp-src.21.0.1.tar.gz, 地址在https://www.erlang.org/downloads

2. 安装gcc, 如果没有的话 

yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel

3. 还要安装一个叫做autoconf的东西 

yum -y install autoconf

4, 切换到解压后的源代码目录中, 执行下面4行, 时间比较长, 耐心等待

./otp_build autoconf
./configure
make
make install

5. whereis erlang 查看路径, erl进入交互模式

有一片参考文档 https://www.cnblogs.com/shizhijie/p/9795244.html

安装好之后如下面

[root@fangzhirui02-huawei-123 emqtt]# erl
Erlang/OTP 21 [erts-10.3] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [hipe]

Eshell V10.3  (abort with ^G)
1> 3 + 4.
7

3. 安装测试工具

# 1. 下载emqtt工程
git clone -b v0.8.1 https://github.com/emqx/emqtt.git 

# 2. 替换src/emqttc.erl文件647行内容, 原来为
# connected(Packet = ?PACKET(_Type), State = #state{name = Name}) ->
#    % ?debug("[Client ~s] RECV: ~s", [Name, emqttc_packet:dump(Packet)]),
#    {ok, NewState} = received(Packet, State),
#    next_state(connected, NewState);
# 替换为
connected(Packet = ?PACKET(_Type), State = #state{name = Name}) ->
     io:format("[Client ~s] RECV: ~s", [Name, emqttc_packet:dump(Packet)]),
     {ok, NewState} = received(Packet, State),
     next_state(connected, NewState); 
# 3. 在emqtt目录下, 重新编译
make clean 
make

4. 运行

./run进入交互模式, 命令行文档在emqtt/README.md, 原作者写的比较简略, 如下列出几个关键命令. 都在同一个命令行执行即可, 无需另开ssh

1. MQTT SSL双向认证

# 连接
{ok, Client} = emqttc:start_link([{client_id, <<"simpleClient">>}, {ssl, [{certfile,"/root/fangzhirui/emqx/etc/certs/client-cert.pem"},{keyfile,"/root/fangzhirui/emqx/etc/certs/client-key.pem"},{cacertfile,"/root/fangzhirui/emqx/etc/certs/root_ca.pem"}]}, {port, 8883}, {host, "127.0.0.1"}]).
#  订阅
emqttc:subscribe(Client, <<"fruit">>, qos0).      
#  发布
emqttc:publish(Client, <<"fruit">>, <<"an apple">>).

2. 简单免密认证

#  连接
{ok, C} = emqttc:start_link([{host, "localhost"}, {port, 1883} , {client_id, <<"simpleClient">>}]).
#  订阅
emqttc:subscribe(C, <<"fruit">>, qos0). 
#  发布
emqttc:publish(C, <<"fruit">>, <<"an apple">>).


举报
分享

分享文章到朋友圈

分享文章到微博

fangzhirui

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-7 16:40:48 沙发 显示全部楼层

Q: 用openssl自带客户端如何试验mqtt ssl可达性?

A:

用openssl简单测试二级证书和服务端密钥的合法性 

openssl verify -CAfile keys/RootCA.crt -untrusted keys/secondCA.crt keys/server.crt

用openssl自带s_server和s_client验证证书有效性

# 首先拷贝 secondCA.pem 的内容并追加到 RootCA.pem 文件末尾
$ openssl s_server -accept 2009 -key server.key -cert server-cert.pem -CAfile RootCA.pem -Verify 1
$ openssl s_client -connect localhost:2009 -CAfile RootCA.pem -cert client-cert.pem -key client.key -showcerts

用openssl的s_client尝试对IoT发起一个mqtt connect报文, 客户端id为a

 echo -en "\x10\x0d\x00\x04MQTT\x04\x00\x00\x00\x00\x01a" | openssl s_client -connect localhost:8883 -CAfile root_ca.pem -cert client-cert.pem -key client-key.pem -showcerts
 # 连接后立即会断开是因为客户端自己断开了连接. 
 # emqttc建立连接后不久就断开是因为emqttc没有按时发送mqtt ping包


点赞 回复 举报

fangzhirui

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-8 14:19:37 板凳 显示全部楼层

Q: ssl认证对包含5个部分, 根CA证书, 服务侧证书和秘钥, 客户端证书和秘钥, 如何生成者5个东西

A: 

#!/bin/sh

rm -rf temp

mkdir temp

echo 01 > temp/serial
touch temp/index.txt

## create ca certificate
openssl req -x509 -config openssl.cnf -newkey rsa:2048 -days 730 -out cacert.pem -outform PEM -subj /CN=MyTestCA/ -nodes
openssl x509 -in cacert.pem -out temp/cacert.cer -outform DER

## create server certificate
openssl genrsa -out server-key.pem 2048
openssl req -new -key key.pem -out temp/server-req.pem -outform PEM -subj /CN=$(hostname)/O=server/ -nodes
openssl ca -config openssl.cnf -in temp/server-req.pem -out cert.pem -notext -batch -extensions server_ca_extensions


openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out temp/client-req.pem -outform PEM -subj /CN=$(hostname)/O=client/ -nodes
openssl ca -config openssl.cnf -in temp/client-req.pem -out client-cert.pem -notext -batch -extensions client_ca_extensions

rm -rf temp

gen_ssl_cert.rar 1013 Bytes,下载次数:0

点赞 回复 举报

fangzhirui

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-8 20:19:59 地板 显示全部楼层

Q: 如何手动从根CA证书生成二级CA证书

A: 

## 生成根 CA 并自签
openssl genrsa -des3 -out keys/RootCA.key 2048
openssl req -new -x509 -days 365 -key keys/RootCA.key -out keys/RootCA.crt  -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=HUAWEI/OU=DIS/CN=ca.huawei.com"

## 生成二级 CA,本例使用系统自带openssl.cnf, 其中默认ca路径为/etc/pki/CA. 若自行指定openssl.cnf, 使用-config ${openssl_file}
echo 02 > /etc/pki/CA/serial
openssl genrsa -des3 -out keys/secondCA.key 2048
openssl rsa -in keys/secondCA.key -out keys/secondCA.key
openssl req -new -days 365 -key keys/secondCA.key -out keys/secondCA.csr -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=HUAWEI/OU=DIS/CN=ca.suba.huawei.com"
mkdir -p /etc/pki/CA/newcerts
openssl ca -extensions v3_ca -in keys/secondCA.csr -config /etc/pki/tls/openssl.cnf -days 365 -out keys/secondCA.crt -cert keys/RootCA.crt -keyfile keys/RootCA.key

## 生成服务端证书
echo 03 > /etc/pki/CA/serial
openssl genrsa -des3 -out keys/server.key 2048
openssl rsa -in keys/server.key -out keys/server.key
openssl req -new -days 365 -key keys/server.key -out keys/server.csr
openssl ca -extensions v3_ca -in keys/server.csr -config /etc/pki/tls/openssl.cnf -days 365 -out keys/server.crt -cert keys/secondCA.crt -keyfile keys/secondCA.key

## 生成客户端证书
echo 04 > /etc/pki/CA/serial
openssl genrsa -des3 -out keys/client.key 2048
openssl rsa -in keys/client.key -out keys/client.key
openssl req -new -days 365 -key keys/client.key -out keys/client.csr
openssl ca -extensions v3_ca -in keys/client.csr -config /etc/pki/tls/openssl.cnf -days 365 -out keys/client.crt -cert keys/secondCA.crt -keyfile keys/secondCA.key

## 转换为 pem 格式
openssl x509 -in RootCA.crt -out RootCA.pem
openssl x509 -in secondCA.crt -out secondCA.pem
openssl x509 -in server.crt -out server-cert.pem
openssl x509 -in client.crt -out client-cert.pem

openssl.cnf.txt 10.67 KB,下载次数:0

点赞 回复 举报

fangzhirui

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-8 20:25:43 5# 显示全部楼层

Q: 二级CA场景1, 客户端和服务端都使用同一个二级证书签发的认证, 证书如何分配? 

A: 

服务端放置二级证书签发的服务端证书&秘钥, 将根证书和二级证书复制到同一个文件中, 中间相隔一个换行符, 该合并证书也放在服务端. 

客户端放置二级证书和二级证书签发的客户端证书&秘钥.

点赞 回复 举报

fangzhirui

发帖: 2粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-8-12 19:19:30 6# 显示全部楼层

Q: 二级证书场景2, 服务端和客户端分别用不同的二级证书, 如何配置

A: 

证书链如图. 合并CA是按照Root CA, Sub CA01, Sub CA02的顺序将三个证书拼接起来. 每段之间用换行分隔. 

证书链.PNG

点赞 回复 举报

游客

您需要登录后才可以回帖 登录 | 立即注册