IBMMQ配置SSL最全教程

环境:

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目录下执行的

**重要**

  1. IBMMQ的密钥库要使用CMS类型的,其他类型不行
  2. 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

  1. 接收端创建密钥库CMS、生成自签名证书、抽取证书,传输给发送端服务器上
  2. 接收端队列管理器配置ssl、接收通道配置ssl
  3. 发送端创建密钥库CMS,添加接收端传输的证书(要使用命令添加)
  4. 发送端队列管理器配置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不行

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IBM MQ 配置 JNDI 的步骤如下: 1. 首先,需要创建一个 JNDI 上下文,可以使用 `InitialContext` 类来创建。例如: ```java Hashtable<String, String> env = new Hashtable<>(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL, "file:///C:/jndi"); Context context = new InitialContext(env); ``` 上面的代码创建了一个文件系统上下文,路径为 `C:/jndi`。 2. 在 JNDI 上下文中绑定 MQ 连接工厂和队列。 ```java // 创建 MQ 连接工厂 MQConnectionFactory cf = new MQConnectionFactory(); cf.setHostName("localhost"); cf.setPort(1414); cf.setQueueManager("QMGR"); cf.setChannel("SYSTEM.DEF.SVRCONN"); // 将 MQ 连接工厂绑定到 JNDI 上下文 context.bind("jms/CF", cf); // 创建队列,将队列绑定到 JNDI 上下文 MQQueue queue = new MQQueue("queue:///TEST.QUEUE"); context.bind("jms/QUEUE", queue); ``` 上面的代码创建了一个 MQ 连接工厂,然后将其绑定到 JNDI 上下文中的 `jms/CF` 名称下。同时,还创建了一个队列,并将其绑定到 `jms/QUEUE` 名称下。 3. 在应用程序中通过 JNDI 获取 MQ 连接工厂和队列。 ```java // 从 JNDI 上下文中获取 MQ 连接工厂 MQConnectionFactory cf = (MQConnectionFactory) context.lookup("jms/CF"); // 从 JNDI 上下文中获取队列 MQQueue queue = (MQQueue) context.lookup("jms/QUEUE"); ``` 上面的代码从 JNDI 上下文中获取了 MQ 连接工厂和队列。 以上就是 IBM MQ 配置 JNDI 的基本步骤。具体的细节还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值