一、客户端开发
可以根据实际情况选择合适的协议,默认协议是OpenWire,通用协议(如果未来可能用其它消息队列组件替换ActiveMQ)可以考虑MQTT、AMQP等协议。
- Java开发
经典版安装包解压缩后,/examples目录下有各个协议的范例代码可以参考。
- .Net开发
Apache官方提供了.Net的组件库,叫做NMS Clients,由API接口(Apache.NMS.dll)和Provider组成,每个协议一个Provider(dll文件),所以只要下载这两个组件使用即可,/examples目录下也有对应的范例。
但官方没有提供MQTT的Provider,也没有范例代码。可通过NuGet上搜索MQTT来获取第三方dll完成开发,如M2Mqtt.Net。
- Web开发
可通过websocket技术实现消息收发;
经典版的MQTT、STOMP都支持websocket,但需要单独配置一个TransportConnector,单独的端口,/examples目录下有对应的范例代码;
Artemis的MQTT、STOMP、AMQP都支持WebSocket,而且不需要单独配置Acceptor,不另开端口。
二、SSL/TLS支持
经典版和Artemis都支持TLS1.2,基本步骤(单向认证为例):
- 在服务端创建密钥对,并导出证书供客户端使用
keytool -genkey -alias broker -keyalg RSA -keystore broker.ks
keytool -export -alias broker -keystore broker.ks -file broker_cert
- 配置ActiveMQ加入SSL支持
经典版
在conf/activemq.xml的broker节点下增加sslContext配置
<sslContext>
<sslContext keyStore="file:${activemq.base}/conf/broker.ks" keyStorePassword="123456"/>
<!--如果是双向认证,还需要配置trustStore 和trustStorePassword 属性-->
</sslContext>
配置transportConnector,协议头加上“+ssl”即可,openwire是例外,直接用ssl即可。
Artemis
编辑<实例>/etc/broker.xml的<acceptor>节点,在末尾增加如下URL参数:
sslEnabled=true;keyStorePath=./broker.ks;keyStorePassword=123456
- 客户端
Java
导入服务端证书为KeyStore
keytool -import -alias broker -keystore client.ts -file broker_cert
改用合适的SslConnectionFactory并设置KeyStore和密码,例如:
ActiveMQSslConnectionFactory _sslConnFactory = new ActiveMQSslConnectionFactory("ssl://xxx.yyy.com:61616");//一定要用域名,可借助host文件
_sslConnFactory.setTrustStore("F:\\Java\\MqDemo\\client.ts");
_sslConnFactory.setTrustStorePassword("123456");
.Net
.Net直接使用服务端导出的证书文件即可,如果是NMS Clients,只需要修改连接URI,加上相关参数即可
ssl://xxx.yyy.com:61616?transport.SslProtocol=Tls12&transport.ClientCertFilename=broker_cert&transport.AcceptInvalidBrokerCert=true
如果用的是M2Mqtt.Net,调整构造函数参数和增加回调函数即可。
String certFile = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "broker_cert");
mqtt = new MqttClient(_hostname, _port, true, new X509Certificate(certFile), null,
MqttSslProtocols.TLSv1_2, new emoteCertificateValidationCallback(caValidCallback));