环境:
INMMQ9.2.0
java8
前言
从 IBM MQ 9.2.0开始,产品在所有平台上都支持 TLS 1.3 安全协议。
1、创建密钥库
可以使用runmqckm,runmqakm 和 strmqikm 来管理数字证书,strmqikm会打开可视化界面,runmqckm、runmqakm这两个命令的区别是支持不同的密钥库
- runmqckm 提供类似于 iKeycmd 的函数,支持 JKS 和 JCEKS 密钥库
- runmqakm 提供类似于 gskitcapicmd 的函数,支持 CMS 和 PKCS11 密钥库
- runmqakm 的命令语法与 runmqckm的语法相同。
- 如果需要以符合 FIPS 的方式管理 TLS 证书,请使用 runmqakm 命令而不是 runmqckm 或 strmqikm 命令。
注: 从 IBM MQ 9.3.4开始不推荐使用针对 IBM® MQ Java 应用程序, AMQP 和 MQTT 的 CMS 密钥库支持。 如果要将 CMS 密钥库与 IBM MQ Java 应用程序, AMQP 和 MQTT 配合使用,那么应该迁移到 IBM MQ 9.3.0中发布的 PKCS#12 密钥存储库支持。也不推荐使用 CMS 密钥库中使用的关联 runmqckm, strmqikm, mqiptKeycmd 和 mqiptKeyman 工具。 来自 IBM MQ 的 runmqakm 命令和来自 JRE 的 keytool 命令可作为替代方法提供。
以mq02队列管理器为例,IBMMQ队列管理器的存储路径一般在 D:\ProgramData\IBM\MQ\qmgrs\mq02,密钥库建议放在ssl目录下,以下命令都是在ssl目录下执行的
**重要**
- IBMMQ的密钥库要使用CMS类型的,其他类型不行
- JAVA客户端密钥库可以使用JKS、JCEKS、PKCS12等类型
1.1 创建IBMMQ密钥库
使用strmqikm来创建IBMMQ的密钥库,有两种方式进入
- 执行strmqikm打开可视化界面
- 打开IBM MQ Explorer,右键单击 IBM MQ,选择管理 SSL 证书
1、创建密钥库,类型选择默认的CMS,其他类型不行
2、新建自签名证书,密钥标签写test(这个后面要用到),算法选择 SHA256WithRSA,其他的可以默认
- 有的资料说密钥标签要写成 ibmwebspheremq + 对列管理器名称 其实没有这样的要求,随便写就可以,只不过队列管理器创建的时候,默认的密钥标签是这个
3、抽取证书。这个证书文件是要发给客户端的,需要导入到客户端密钥库。
也可以使用下面命令来创建密钥库,但是我创建的密钥库,在客户端连接的时候连不上,会报错,还没找到原因
//创建密钥库、生成自签名证书
runmqakm -keydb -create -db test.kdb -pw 123456 -type cms -stash
runmqakm -cert -create -label test -db test.kdb -pw 123456 -dn "C=CN" -expire 365 -size 1024 -sig_alg SHA256WithRSA
//抽取证书;设置默认密钥库;查看证书
runmqakm -cert -extract -label test -db test.kdb -pw 123456 -target test.arm
runmqakm -cert -setdefault -label test -db test.kdb -pw 123456
runmqakm -cert -list -db test.kdb -pw 123456
1.2 队列管理器配置SSL
在队列管理器属性中,注意画红线的两个位置
- 密钥库就是上面创建的密钥库文件的路径,注意test后面不要加文件后缀
- 证书标签就是上面创建自签名证书的密钥标签
1.3 通道配置SSL
新建一个服务器连接通道SVRCONN,在SSL CiperSpec选择 TLS_RSA_WITH_AES_128_CBC_SHA256 ,SSL认证选可选的,证书标签还是test
2、java客户端
2.1 创建客户端密钥库
java客户端不能使用CMS类型的密钥库
//1、创建java客户端密钥库,jks类型
//2、给密钥库添加证书
//3、查看密钥库证书
runmqckm -keydb -create -db app.jks -pw 123456 -type jks
runmqckm -cert -add -label test -file test.arm -db app.jks -pw 123456
runmqckm -cert -list -db app.jks -pw 123456
//JCEKS类型
runmqckm -keydb -create -db app.jcs -pw 123456 -type JCEKS
runmqckm -cert -add -label test -file test.arm -db app.jcs -pw 123456
runmqckm -cert -list -db app.jcs -pw 123456
//PKCS12类型
runmqckm -keydb -create -db app.p12 -pw 123456 -type PKCS12 -stash
runmqckm -cert -add -label test -file test.arm -db app.p12 -pw 123456
runmqckm -cert -list -db app.p12 -pw 123456
2.2 Java代码
public class IBMMQClient {
public static void main(String[] args) throws Exception {
//设置密钥库\信任库
System.setProperty("javax.net.ssl.trustStore", "D:\\ProgramData\\IBM\\MQ\\qmgrs\\mq02\\ssl\\app.jks");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
System.setProperty("javax.net.ssl.trustStoreType", "jks");
// System.setProperty("javax.net.ssl.trustStoreType", "jceks");
// System.setProperty("javax.net.ssl.trustStoreType", "pkcs12");
//使用keyStore是不行的,这里只是记录下
// System.setProperty("javax.net.ssl.keyStoreType", "jks");
// System.setProperty("javax.net.ssl.keyStore", "D:\\ProgramData\\IBM\\MQ\\qmgrs\\mq02\\ssl\\app.jks");
// System.setProperty("javax.net.ssl.keyStorePassword", "123456");
// 这里标识下,不使用IBM的JDK,那么对应的sslCipherSuite才是TLS_RSA_WITH_AES_128_CBC_SHA256
System.setProperty("com.ibm.mq.cfg.useIBMCipherMappings", "false");
MQEnvironment.sslCipherSuite = "TLS_RSA_WITH_AES_128_CBC_SHA256";
// MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_AES_128_CBC_SHA256";
//sslPeerName设置证书的专有名称,这里要与通道的设置相匹配
// MQEnvironment.sslPeerName = "CN=QMGR.*, OU=IBM, OU=WEBSPHERE";
MQEnvironment.hostname = "*************";
MQEnvironment.port = 1414;
MQEnvironment.channel = "SVRCONN"; // 服务器连接通道
MQEnvironment.userID = "myuser";
MQEnvironment.password = "*******"; //用户名对应的密码
MQQueueManager qMgr = new MQQueueManager("MYSSL");
System.out.println("Connected to " + qMgr.getName());
qMgr.disconnect();
}
}
3、IBMMQ通道SSL传输
发送通道、接收通道配置SSL
- 接收端创建密钥库CMS、生成自签名证书、抽取证书,传输给发送端服务器上
- 接收端队列管理器配置ssl、接收通道配置ssl
- 发送端创建密钥库CMS,添加接收端传输的证书(要使用命令添加)
- 发送端队列管理器配置ssl、接收通道配置ssl
4、相关知识
4.1 CipherSpecs 和 CipherSuites
Java Cryptography Architecture Oracle Providers Documentation
CipherSpecs 和 CipherSuites 是加密算法的特定组合标识。
处理IBMMQ通道时,使用 CipherSpec。 处理Java通道、JMS通道或MQTT通道时,使用CipherSuite。有个对应关系,见上面的链接中的表。
重点说明下CipherSuite:
- 当使用oracle jdk时,CipherSuite对应的标识为:TLS_RSA_WITH_AES_128_CBC_SHA256
- 当使用IBM自己的jdk时,CipherSuite对应的标识才是:SSL_RSA_WITH_AES_128_CBC_SHA256
4.2 trustStore 和 keyStore
注意:这里使用keyStore不行