环境:

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

参考:IBM Documentation

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不行

好文推荐

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。

大家都在找:

ssl:ssl协议未开启是什么意思

中间件:中间件容器

大家都在看: