文章目录

  • 背景信息
  • 1、CA证书信任模型
  • 2、创建证书
    • 2.1 Root CA 证书创建
    • 2.2 emqx 服务端证书签发
    • 2.3 中间CA证书签发
    • 2.4 设备证书签发
  • 3、配置EMQX服务端证书
  • 4、客户端使用TLS连接EMQX

背景信息

   本文主要介绍了通过建立三层CA证书链,为EMQX集群提供PKI服务,实现客户端与云端的双向认证。EMQX集群部署,请参考:支持上亿物联网终端设备接入的MQTT集群。

1、CA证书信任模型


  根CA为EMQX服务签发服务器端证书,以及给中间CA签发中间证书,由中间CA给设备签发设备证书。

2、创建证书

  使用不同的 CA 服务,证书签发的流程以及需要的参数不同,如大部分支持安全芯片的设备,其私钥通常由设备端生成,通过向 CA 发送 csr 请求文件的方式获取CA机构签发的证书。下文仅借助流行的 cfssl 工具来完成证书的创建工作,设备端私钥由 cfssl 工具生成,如果尚未安装 cfssl 工具,请查看 cfssl 工具下载相关文章

2.1 Root CA 证书创建

  • 创建 ca-csr.json
{"CN": "emqx","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "Hubei","L": "Wuhan","O": "emqx","OU": "system"}],"ca": {"expiry": "87600h"}
}
  • 创建根CA私钥与公钥
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -

  通过上边命令得到根CA的私钥 ca-key.pem 以及Root CA的字签名根证书 ca.pem

  • 创建CA签发证书的配置文件 ca-config.json
{"signing": {"default": {"expiry": "87600h"},"profiles": {"emqx": {"usages": ["signing","key encipherment","server auth","client auth"],"expiry": "87600h"}}}

2.2 emqx 服务端证书签发

  • 创建 emqx-server-csr.json 文件
{"CN": "emqx","hosts": ["*"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "Hubei","L": "Wuhan","O": "emqx","OU": "system"}]
}
  • 使用Root CA 私钥签发 emqx 服务端证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=emqx emqx-server-csr.json | cfssljson -bare emqx-server

  通过上边的命令,将会得到 emqx 服务端的私钥 emqx-server-key.pem,以及证书文件 emqx-server.pem. 这两个文件将会写入到 EMQX 配置文件 /etc/emqx/emqx.conf

2.3 中间CA证书签发

  • 创建 emqx-intermediate-csr.json 文件
{"CN": "emqx","hosts": ["*"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "Hubei","L": "Wuhan","O": "emqx","OU": "system"}]
}
  • 使用Root CA 私钥签发中间CA的证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=emqx emqx-intermediate-csr.json | cfssljson -bare emqx-intermediate

  通过上边的命令,将会得到中间CA的私钥 emqx-intermediate-key.pem,以及中间CA的证书 emqx-intermediate.pem。中间CA的证书将会被写入到 EMQX 配置文件 /etc/emqx/emqx.conf 中。

2.4 设备证书签发

  • 创建设备证书签发配置参数模板文件 emqx-device-csr.json
{"CN": "emqx","hosts": ["*"],"key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "Hubei","L": "Wuhan","O": "emqx","OU": "system"}]
}
  • 为设备A签发证书
cfssl gencert -ca=emqx-intermediate.pem -ca-key=emqx-intermediate-key.pem -config=ca-config.json -profile=emqx emqx-device-csr.json | cfssljson -bare emqx-device-A

   通过指定上边命令将会得到设备A的私钥 emqx-device-A-key.pem,以及设备A的证书 emqx-device-A.pem

  • 为设备B签发证书
cfssl gencert -ca=emqx-intermediate.pem -ca-key=emqx-intermediate-key.pem -config=ca-config.json -profile=emqx emqx-device-csr.json | cfssljson -bare emqx-device-B

   通过指定上边命令将会得到设备A的私钥 emqx-device-B-key.pem,以及设备A的证书 emqx-device-B.pem。如需给更多的设备签发证书,只需将上边的参数 emqx-device-B 换成其他设备名称即可。

3、配置EMQX服务端证书

  emqx 默认的配置文件在 /etc/emqx/emqx.conf 中,修改配置文件,添加 ssl 证书配置信息,以及开启双向认证。

listeners.ssl.default {bind = "0.0.0.0:8883"max_connections = 512000ssl_options {keyfile = "/etc/ssl/emqx/emqx-server-key.pem"certfile = "/etc/ssl/emqx/emqx-server.pem"cacertfile = "/etc/ssl/emqx/emqx-intermediate.pem"verify = verify_peer# 强制开启双向认证,如果客户端无法提供证书,则 SSL/TLS 连接将被拒绝fail_if_no_peer_cert = true}
}
  • keyfile: 设置 emqx 服务端私钥文件
  • certfile:设置 emqx 服务端证书文件
  • cacertfile:设置为终端签发证书的CA机构证书

ssl 配置修改完成后,需要重启 emqx 服务,在重启服务之前,建议给证书文件设置可读权限,防止emqx服务端没有权限读取证书文件。

chmod +r /etc/ssl/emqx/*
systemctl restart emqx

4、客户端使用TLS连接EMQX


   上图是 EMQX 提供的客户端工具,里边设计到的关键参数有:

  • 服务器地址:EMQX 服务的域名或IP地址,协议选择:mqtts://,表示连接EMQX的 ssl 坚挺类型。
  • SSL/TLS:选中开启后,表示客户端与服务端使用 TLS 加密传输,发起连接请求需要携带证书。
  • SSL安全:如果开启该功能项,将会校验证书以及证书链的有效性,由于上问中字签发证书 hosts 没有填写具体的服务器IP或域名,如果开启该功能,将会导致证书校验失败,所以此处没有开启该功能。
  • 证书类型:选择 Self signed 表示使用自签发证书。
  • CA 文件:填写 Root CA 机构的根证书文件;
  • 客户端证书:填写设备证书。
  • 客户端 key 文件:填写设备私钥。

      参数设置完成后,点击链接按钮,连接成功后会有提示信息,如上图右上角 已连接 提示消息。同时 emqx 的管理控制台也会有连接成功的客户端信息

      到此,通过自签发证书的方式实现了 EMQX 集群与客户端之间的双向认证。EMQX 集群直接与设备采用TLS加密传输,在性能上有一定的损耗,官方建议将设备与云之间的双向认证由负载均衡服务终结,即:设备到负载均衡服务采用双向认证,负载均衡服务终结TLS,然后与 EMQX 集群采用非TLS传输。后续将会选择 HAPorxy 来作为负载均衡服务,实现官方推荐的双向认证服务。敬请期待…

使用自签发CA证书为EMQX开启双向认证相关推荐

  1. emqx使用自制CA证书登录配置(双向认证)

    1)服务器环境 操作系统:centos 7 Emtqq版本:v3.1.0 Mysql版本:V5.6+ 2).生成自签名的CA key和证书(简单起见客户端和服务端共用一个CA证书) openssl g ...

  2. DotNetty TLS 开启双向认证加密传输数据

    这里写目录标题 DotNetty TLS 开启双向认证加密传输数据 一.生成PFX证书 二.服务器端 2.1 引用Nuget: 2.2 创建处理请求类 2.3 注册DotNetty监听服务 三.客户端 ...

  3. Debian 10.x自签发CA证书与Apache建立HTTPS安全连接网站

    环境概述 Debian 10.x 安装apache服务 Client可供管理员使用,有三台服务器Rserver,Server01,Server04 Client:10.10.100.x(DHCP获取) ...

  4. Octavia 的 HTTPS 与自建、签发 CA 证书

    目录 文章目录 目录 Octavia 为什么需要自建 CA 证书? GenerateServerPEMTask CertComputeCreate Amphora Agent AmphoraAPICl ...

  5. 用pfx证书java双向认证_把CA证书生成的crt的证书和pem的私钥转换成java能够使用的keystore和pcks12的证书,实现https双向认证...

    最近在做一个https双向认证的工作,领导先让我实现,我之前写了一篇文章,把tomcat的生成证书和配置的实现写了出来. 现在领导给了我服务器的CA证书的客户端证书和私钥,服务端信任证书,分别是crt ...

  6. 利用Openssl自签名证书生成与单双向认证通信

    文章目录 1.什么是CA? 2.如何生成证书 2.1生成CA key 3.生成服务器私钥/证书 4.生成客户端私钥/证书 5.测试 1.什么是CA? 1.CA(Certificate Authorit ...

  7. soapui 证书_配置https双向认证,以及用soapui调试

    maxThreads="150" scheme="https" secure="true" clientAuth="false&q ...

  8. 浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证

    最近在研究openssl签发证书,在网上搜索关于openssl的用法.资料等等,总觉得非常分散,而且讲得比较浅,文章虽然不少,但是缺少真正能给你讲的明白得,仅停留在"能用"上,感慨 ...

  9. openssl私有CA证书签发与单双向认证

    什么是CA? CA是数字认证中心的简称.指的是发放.管理.废除数字证书的机构. CA的作用: 检查证书持有者身份的合法性.签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理. 建 ...

最新文章

  1. Y君:天天增删改查,又能怎么样?
  2. pytorch笔记: 处理inf和nan数值
  3. Android: 自定义Tab样式
  4. SQL基础操作_6_处理数字
  5. Reactor线程模型
  6. HTML基本功之文档结构
  7. 10-1-数据库连接池
  8. 修改mslsql服务器端口号,复制服务器安装步骤.doc
  9. Redis缓存组件开发规范
  10. servlet中doGet()和doPost()的区别
  11. C++ Primer中英文版 (第5版)
  12. ZooKeeper管理工具一览
  13. 微信图片太模糊如何弄清晰?微信图片过期怎么恢复原图
  14. Python十分钟轻松入门
  15. 网速前端计算系统探测
  16. Interceptor for {http://admin.ws…thrown exception, unwinding now java.lang.NullPointerException
  17. 2017 年节点——T 型成长,持续学习
  18. jquery限制只能输入英文逗号和数字
  19. Linux 各类设置、配置、使用技巧参考,Linux使用集锦
  20. 网站采集工具之免费帝国CMS采集聚合

热门文章

  1. 做硬件产品经理的困惑
  2. 写作业用白光还是暖光?盘点色温4000K的护眼台灯
  3. 微信小程序(返回顶部功能)
  4. Windows Azure真实案例:NeoGeo New Media --SQL Azure提高数字媒体资产解决方案的拓展性...
  5. 8.9 快译通项目设计
  6. 扁平化网站设计风格七大技巧
  7. 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录...
  8. 卡西欧电子表怎么调时间
  9. advanced mathematics 8
  10. ValueError: embedded null character 和 FileNotFoundError: [Errno 2] No such file or directory 错误处理