应用场景
本文是通过介绍使用 WebSphere MQ Telemetry 以及其 SDK 组件中自带的 MQTT 基本客户机的 Java API 开发一个基于 SSL,JAAS 的通用安全连通解决方案应用场景来使读者对使用基于 MQTT 协议的 WebSphere MQ Telemetry 来构建物联网连通解决方案有进一步的理解,并能够自己动手开发相应的连通解决方案。
本场景介绍了如何开发一个基于安全连接的物联网解决方案。该方案通过 WebSphere MQ Telemetry 以及其 SDK 组件中自带的 MQTT 基本客户机的 Java API 来实现连通,在设计阶段通过开发基于 MQTT 基本客户机 Java API 的传感器端信息获取程序,然后通过 MQTT Java API 提供的连通能力,发布和订阅信息,同时,在前端域通过 WebSphere MQ Telemetry 的遥测服务监听客户端的连接,然后将消息通过 WebSphere MQ Telemetry 遥测通道发送到具体的消息订购者,最后通过系统预定义的订购将消息放入指定的队列中,供其他系统应用。图 3 简单的描述了整个应用场景的连通模型:
连通方案开发步骤及流程
本文实现安全的连通会使用到 WebSphere MQ Telemetry 的 SSL 和 JAAS 支持功能,并且在 MQTT 基本客户机 Java API 中都有实现,以下会分别从 JAAS 的客户端、服务器端开发配置和 SSL 的客户端、服务器端开发和配置介绍。
Note:开发工具使用 Eclipse,WebSphere MQ Explorer。
JAAS 开发配置 - 服务器
在服务器端,需要开发相应的 JAAS 的 Login 类,然后配置 WebSphere MQ Telemetry 的 JAAS 相关属性,然后新建或者修改遥测通道,增加相应的 JAAS 设置。
在 Eclipse 中新建 JAVA 工程,在工程中新建类 LoginModule 实现接口 javax.security.auth.spi.LoginModule 和类 Principal 实现接口 java.security.Principal ,java.io.Serializable。这些类在 WebSphere MQ Telemetry 的 SDK 中也有参考实现 sample,可以直接导入然后修改。路径为:WMQ Installation\mqxr\samples\ JAASLoginModule.java JAASPrincipal.java。修改为自己的文件名。将原有 Login 方法中认证代码段:
public Boolean login() { … // Accept everything. if (true) { loggedIn = true; } else throw new javax.security.auth.login.FailedLoginException("Login failed"); … } |
修改为自己的认证逻辑:
public Boolean login() { … // Accept everything. if(username != null && username.equalsIgnoreCase("XR")) loggedIn = true else throw new javax.security.auth.login.FailedLoginException("Login failed"); … } |
这里只是简单的设置如果用户名是“XR”,则鉴权成功。
注意 : 注意 Eclipse 使用的 JRE 编译环境需与 WebSphere MQ Telemetry 的 JRE 兼容。
修改 WebSphere MQ Telemetry 的 JAAS 设置。找到服务器端的 JAAS 配置文件:WMQ Installation\qmgrs\qMgrName\mqxr\jaas.config,修改或者添加自己的认证模块。本文中添加了新的认证模块实现。XRConfig { samples.XRLoginModule required debug=true; }; MQXRConfig { samples.JAASLoginModule required debug=true; //com.ibm.security.auth.module.NTLoginModule required; //com.ibm.security.auth.module.Krb5LoginModule required // principal=principal@your_realm // useDefaultCcache=TRUE // renewTGT=true; //com.sun.security.auth.module.NTLoginModule required; //com.sun.security.auth.module.UnixLoginModule required; //com.sun.security.auth.module.Krb5LoginModule required // useTicketCache="true" // ticketCache="${user.home}${/}tickets"; }; |
指定认证模块的类名 samples.XRLoginModule。
编辑 services.env 文件设定 JAAS 认证模块类的路径。生成新的 services.env 或者在原文件中添加内容如下:
CLASSPATH=C:\Program Files\IBM\WebSphere MQ\mqxr\samples;
这个地址是第 2 步中生成的 class 文件的路径。然后将第 2 步中生成的 class 文件连同 package 放入上述文件中的 classpath。
也可以修改系统的 CLASSPATH,将认证模块的路径添加到系统的 classpath 中。
注意:service.env 文件缺省位置 WMQ installation\service.env,使用每个队列管理器的 service.env 文件也可以覆盖这些设置 :WMQ Installation\Qmgrs\qMgrName\service.env,Service.env 中不能包含任何变量。
使用 WebSphere MQ Explorer 建立基于 JAAS 的遥测通道。在 JAAS 配置文件中,输入第 3 步中添加的认证模块名称。