mosquitto mqtt tls 认证

来源:互联网 发布:查看足球球员数据 编辑:程序博客网 时间:2024/05/29 15:03

物联网交流群:651219170

TLS和SLL 简介

SSL/TLS协议提供的作用。

认证用户和服务器,确保数据发送到正确的客户机和服务器;
加密数据以防止数据中途被窃取;
维护数据的完整性,确保数据在传输过程中不被改变。
更加详细的介绍在 tls 解释这编文章中。

制作 CA 证书

SSL在身份认证过程中需要有一个双方都信任的CA签发的证书,CA签发证书是需要收费的,但是在测试过程中,可以自己产生一个CA,然后用自己产生的CA签发证书,下面的mosquitto的ssl功能的测试过程就是采用这一方式。

openssl req -x509 -newkey rsa:2048 -days 36500 -extensions v3_ca -keyout ca.key -nodes -out ca.crt -subj “/CN=china/O=mqtt-owner/OU=mqtt-CA/emailAddress=yuhaiyang457288@sina.com”

该命令中选项“-x509”表示该条命令将产生自签名的证书,一般都是测试的时候采用。
-newkey rsa:2048 指生成新的密钥文件。使用 rsa:2048 算法。
-nodes 如果该选项被指定,如果私钥文件已经被创建则不用加密。
-subj 用于指定生成的证书请求的用户信息,或者处理证书请求时用指定参数替换。生成证书请求时,如果不指定此选项,程序会提示用户来输入各个用户信息,包括国名、组织等信息,如果采用此选择,则不需要用户输入了。比如:-subj /CN=china/OU=test/O=abc/CN=forxy,注意这里等属性必须大写。

使用自己的CA给server 签发证书

生成mqtt服务器的私钥 mqtt-server.key

openssl genrsa -out mqtt-server.key 2048

产生证书签发的请求文件 server.csr(为了生成证书的中间文件)

openssl req -new -sha256 -out mqtt-server.csr -key mqtt-server.key -subj “/CN=china/O=mqtt-server/OU=mqtt-server/emailAddress=yuhaiyang457288@sina.com”

为mosquitto server产生证书文件 mqtt-server.crt

openssl x509 -req -in mqtt-server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out mqtt-server.crt -days 36500

tls 怎么验证服务端的证书。

客户端验证服务器就是通过本地信任的 ca 证书去验证服务器的证书是否合法。
ca证书验证服务器证书的过程就是用ca证书里面的公钥去验证服务器证书里面由ca的私钥签名的部分。

mosquitto 配置

cafile /tmp/ca.crt # 自签名的 ca 的证书
certfile /tmp/mqtt-server.crt # 会下发给客户端的 mqtt-server.crt 证书
keyfile /tmp/mqtt-server.key #服务器的私钥

把自己的 ca 证书变成信任的证书。

客户端接收到服务器的证书的时候会用本地的信任的ca机构的证书来验证服务器的证书签名的合法性。信任的ca机构是在浏览器里或者系统镜像里加好了。我们自签名的 ca 机构的肯定不在系统默认的 ca 机构里。下面就是把我们的 ca.crt 导入 jvm 默认的信任机构的证书(cacerts证书库)中的办法。当然你也可以不更改这个信任证书库,而在程序里面指定使用我们的 ca.crt。这个在之前的 mqtt java tls 客户端文章中有。

方法如下

    假设你的jdk安装在C:\jdk1.5这个目录,
    开始 >> 运行 >> 输入cmd 进入dos命令行 >>
    再用cd进入到C:\jdk1.5\jre\lib\security这个目录下
    敲入如下命令回车执行
    keytool -import -alias cacerts -keystore cacerts -file d:\software\ca.crt
    此时命令行会提示你输入cacerts证书库的密码,
    你敲入changeit就行了,这是java中cacerts证书库的默认密码,
    你自已也可以修改的。
导入后用-list查看(没有使用-alias指定别名,所以是mykey),其中md5会和证书的md5对应上。
mykey, 2012-10-26, trustedCertEntry,
认证指纹 (MD5): 8D:A2:89:9A:E4:17:07:0B:BD:B0:0C:36:11:39:D0:3D
    ok,大功告成!
以后更新时,先删除原来的证书,然后导入新的证书

需要KeyStore的方法可以直接给null,就是默认的了.
TrustManagerFactory tmf=TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm()
);
tmf.init((KeyStore)null);