生成证书

# * Redistributions in binary form must reproduce the above copyright

#   notice, this list of conditions and the following disclaimer in the

#   documentation and/or other materials provided with the distribution.

# * Neither the name of the axTLS project nor the names of its

#   contributors may be used to endorse or promote products derived

#   from this software without specific prior written permission.

#

# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS

# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT

# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR

# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR

# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,

# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED

# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,

# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY

# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING

# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF

# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

#

#

# Generate the certificates and keys for testing.

#

PROJECT_NAME="TLS Project"

# Generate the openssl configuration files.

cat > ca_cert.conf << EOF 

[ req ]

distinguished_name     = req_distinguished_name

prompt                 = no

[ req_distinguished_name ]

 O                      = $PROJECT_NAME Dodgy Certificate Authority

EOF

cat > server_cert.conf << EOF 

[ req ]

distinguished_name     = req_distinguished_name

prompt                 = no

[ req_distinguished_name ]

 O                      = $PROJECT_NAME

 CN                     = 192.168.111.100

EOF

cat > client_cert.conf << EOF 

[ req ]

distinguished_name     = req_distinguished_name

prompt                 = no

[ req_distinguished_name ]

 O                      = $PROJECT_NAME Device Certificate

 CN                     = 192.168.111.101

EOF

mkdir ca

mkdir server

mkdir client

mkdir certDER

# private key generation

openssl genrsa -out ca.key 1024

openssl genrsa -out server.key 1024

openssl genrsa -out client.key 1024

# cert requests

openssl req -out ca.req -key ca.key -new \

            -config ./ca_cert.conf

openssl req -out server.req -key server.key -new \

            -config ./server_cert.conf

openssl req -out client.req -key client.key -new \

            -config ./client_cert.conf

# generate the actual certs.

openssl x509 -req -in ca.req -out ca.crt \

            -sha1 -days 5000 -signkey ca.key

openssl x509 -req -in server.req -out server.crt \

            -sha1 -CAcreateserial -days 5000 \

            -CA ca.crt -CAkey ca.key

openssl x509 -req -in client.req -out client.crt \

            -sha1 -CAcreateserial -days 5000 \

            -CA ca.crt -CAkey ca.key

openssl x509 -in ca.crt -outform DER -out ca.der

openssl x509 -in server.crt -outform DER -out server.der

openssl x509 -in client.crt -outform DER -out client.der

mv ca.crt ca.key ca/

mv server.crt server.key server/

mv client.crt client.key client/

mv ca.der server.der client.der certDER/

rm *.conf

rm *.req

rm *.srl

  

将上述代码保存为makefile.sh

做如下修改,终端执行。

  • 修改 CN 域中 IP 地址为你主机/设备的 IP 地址

  • [可选]加密位数 1024 修改为你需要的加密位数

CA校验证书测试

进行如下测试,以验证证书是否可用:

$openssl verify -CAfile ca/ca.crt server/server.crt

$openssl verify -CAfile ca/ca.crt client/client.crt

结果如下:

配置单/双向认证

step 1.进入配置文件

sudo vim /etc/mosquitto/mosquitto.conf

step 2.找到 Default listener,在该栏下进行如下配置

再找到Certificate based SSL/TLS support字段.

即:

port 8883

cafile /etc/mosquitto/CA/ca.crt

certfile /etc/mosquitto/CA/server/server.crt

keyfile /etc/mosquitto/CA/server/server.key

require_certificate true

use_identity_as_username true

  

根据自己路径不同配置校验文件路径,这里是把文件放在/etc/mosquitto/CA/下

注意!!!

根据单向认证和双向认证需要,可能需修改的字段有:

a) port 8883 // MQTT服务器将选择此端口 listen

b) cafile /etc/mosquitto/CA/ca.crt

双向认证必须配置为你的CA证书

单向认证(通常认为是client校验server证书,下同)可选配置

单向认证中,server 和 client 端 ca 配置必须保持一致。即 server 若配置 ca.crt ,则 client 必须配置 ca.crt, server 不配置ca.crt ,client 也不可配置 ca.crt

路径必须为绝对路径!!!

c) certfile /etc/mosquitto/CA/server/server.crt

单项认证和双向认证都必须配置为你的server证书

d) keyfile /etc/mosquitto/CA/server/server.key

单项认证和双向认证都必须配置为你的server私钥

e) require_certificate true

单向认证需设置为 false,注释此行,默认也是 false

双向认证必须配置为true

f) use_identity_as_username true

单向认证设置为 false,注释此行,默认也是 false

双向认证通常设置为true

从上面可以看出,双向和单项认证的区别是,除了需要单向SSL认证需要的CA的证书,服务器端的公钥和私钥的证书之外,还需要开启下面的两个开关。

 

require_certificate true

use_identity_as_username true

  

 

重启服务

mosquitto -c /etc/mosquitto/mosquitto.conf

如果提示端口被占用,先ps出mosquitto,再kill掉

ps -aux | grep "mosquitto"

kill -9 XXXXX

单双向切换

单向认证只需要注释两行即可:

#require_certificate true

#use_identity_as_username true

如下:

port 8883

cafile  /etc/mosquitto/CA/ca/ca.crt

certfile  /etc/mosquitto/CA/server/server.crt

keyfile  /etc/mosquitto/CA/server/server.key

同时打开单双向认证

step 1.

在先将/etc/mosquitto/mosquitto.conf 文件按上面配置默认打开双向认证,再找到 Extra listener字段

进行如下配置,打开另一个端口用作单向认证

step 2.

再在该字段下找到Certificate based SSL/TLS support字段

 

step 3.重启服务

mosquitto -c /etc/mosquitto/mosquitto.conf

验证

step 1.进入到CA证书目录下:

step 2.双向:

终端一:订阅

mosquitto_sub -h 10.30.11.47  -p 8883 -t "mqtt/server/topic" --cafile ./ca/ca.crt --cert ./client/client.pem --key ./client/client.key &

终端二:发布

mosquitto_pub -h 10.30.11.47  -p 8883 -t "mqtt/server/topic" -m "hello,world!" --cafile ./ca/ca.crt --cert ./server/server.pem --key ./server/server.key

  

step 3. 单向

终端一:订阅

mosquitto_sub -h 10.30.11.47  -p 8884 -t "mqtt/server/topic" --cafile ./ca/ca.crt &

  

终端二:发布

mosquitto_pub -h 10.30.11.47  -p 8884 -t "mqtt/server/topic" -m " hello,world!" --cafile ./ca/ca.crt

  

mosquitto ---SSL/TLS 单向认证+双向认证的更多相关文章

  1. 使用wireshark观察SSL/TLS握手过程--双向认证/单向认证

    SSL/TLS握手过程可以分成两种类型: 1)SSL/TLS 双向认证,就是双方都会互相认证,也就是两者之间将会交换证书.2)SSL/TLS 单向认证,客户端会认证服务器端身份,而服务器端不会去对客户 ...

  2. 基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证

    基于mosquitto的MQTT服务器---SSL/TLS 单向认证+双向认证 摘自:https://blog.csdn.net/ty1121466568/article/details/811184 ...

  3. 基于openssl的单向和双向认证

    1.前言 最近工作涉及到https,需要修改nginx的openssl模块,引入keyless方案.关于keyless可以参考CloudFlare的官方博客: https://blog.cloudfl ...

  4. nginx配置ssl加密(单双向认证、部分https)

    nginx配置ssl加密(单双向认证.部分https) nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始 ...

  5. [转帖]nginx配置ssl加密(单/双向认证、部分https)

    nginx配置ssl加密(单/双向认证.部分https) https://segmentfault.com/a/1190000002866627   nginx下配置ssl本来是很简单的,无论是去认证 ...

  6. m.Tomcat使用openssl走APR通道配置单向和双向认证

    引用自: http://blog.csdn.net/gtuu0123/article/details/5827800(Tomcat的SSL单向认证)  http://blog.csdn.net/gtu ...

  7. nginx配置ssl加密(单/双向认证、部分https)

    nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始采用的是全站加密,所有访问http:80的请求强制转换( ...

  8. 基于SSL协议的双向认证 - 双向认证 [3]

    1      SSL双向认证的实现 这里是基于SSL和Tomcat配置实现的,配置方法如下: 1.1    生成CA数字证书 首先需要配置OPENSSL环境变量. 我的OPENSSL配置文件路径是“D ...

  9. nginx配置SSL实现服务器/客户端双向认证

    http://blog.csdn.net/kunoy/article/details/8239653 本人不才,配置了两天,终于搞出来了,结合网上诸多博文,特此总结一下! 配置环境: Ubuntu 1 ...

随机推荐

  1. ES6 Javascript 实用开发技巧

    ES6 实用开发技巧 定义变量/常量 ES6 中新增加了 let 和 const 两个命令,let 用于定义变量,const 用于定义常量 两个命令与原有的 var 命令所不同的地方在于,let, c ...

  2. 使用本地的Nuget Repository加速Nuget访问速度

    Nuget是一个在VisualStudio下的非常好用的包管理器,然而由于众所周知的原因,其访问速度非常令人抓狂,甚至抽风.在没有VPN的环境下,如何解决这一问题呢?常见的解决方案是自己搭建一个Nug ...

  3. Android的Master/Detail风格界面中实现自定义ListView的单选

    原文在这里:http://duduli.iteye.com/blog/1453576 可以实现多选,那么如何实现单选呢,这里我写了一个非常简单的方法: public void onListItemCl ...

  4. Computer Vision Tutorials from Conferences (3) -- CVPR

    CVPR 2013 (http://www.pamitc.org/cvpr13/tutorials.php) Foundations of Spatial SpectroscopyJames Cogg ...

  5. flume学习(三):flume将log4j日志数据写入到hdfs(转)

    原文链接:flume学习(三):flume将log4j日志数据写入到hdfs 在第一篇文章中我们是将log4j的日志输出到了agent的日志文件当中.配置文件如下: tier1.sources=sou ...

  6. Echarts的legend改变图例图标为自定义图片

    当折线图时,legend默认时rect形式,如果需要改图例形状,可以自己设置legend的icon属性 legend: { icon:'stack' }, 1.自定义每个图例样式:为data的每个对象 ...

  7. vue-router路由元信息详解

    一.官方文档 路由元信息:定义路由的时候可以配置 meta 字段 const router = new VueRouter({ routes: [ { path: '/foo', component: ...

  8. 【Python】Django RestFramework资料

    A ReSTful API is becoming a standard component of any modern web application.  The Django Rest Frame ...

  9. 红帽RHOP 8 发布一条龙方案

    导读 日前,Canonical的Ubuntu在OpenStack的云系统方面处于业界领先地位.其他诸如IBM类顶级科技公司也有意加入OpenStack的混战,新的专用OpenStack公司(例如Mir ...

  10. 如何在Django1.6结合Python3.4版本中使用MySql

    唉,最近赶了个新潮,用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql. 悲催的是在Python2.7时代连接MySql的MySQLdb还不支持Python3.4,还 ...