本文向您展示如何配置从Java™/ JMS客户端到IBM®WebSphere®MQ队列管理器的安全套接字层(SSL)连接。 它涵盖测试证书的创建,但不涵盖任何MQ配置信息。 它纯粹是Java / JMS客户指南,并且需要IBM SDK。
需要以下步骤1、3和4来配置SSL连接。 仅当您希望配置客户端身份验证时,才执行步骤2。 为了降低复杂性并简化任何潜在问题的调试,建议您最初不要使用客户端身份验证。 建立基本的SSL连接后,可以升级到客户端身份验证。
如果遇到配置问题,则可能有助于指定调试标志: -Djavax.net.debug=true 。
顾名思义,trustStore拥有您信任的队列管理器的签名CA的证书。 对于Java / JMS客户端,这意味着与队列管理器建立连接时,它将作为初始SSL握手的一部分将其证书发送给我们。 处理所有SSL通信的JSSE将在trustStore中查找以验证刚刚发送的证书。 如果无法验证证书,则连接将终止。
要创建trustStore并导入证书,可以使用IBM Key Management工具,该工具是Websphere MQ V6的一部分:
在开始栏中,选择程序=> IBM Websphere MQ => IBM密钥管理 。 IBM Key Management启动时,单击“ 新建”并设置以下值: 密钥数据库类型 JKS 文档名称 trustStore 位置 您选择的位置 单击确定继续。仅当与队列管理器建立连接时希望进行客户端身份验证时,才完成本节。 如果尚未在通道上指定客户端身份验证,则无需完成本节。
除了存储客户端的个人证书,并且JSSE要求访问密码外,keyStore本质上与trustStore相同。 实际上,您可以将您的个人证书添加到之前创建的trustStore中,它将同时充当trustStore和keyStore,但是现在不需要将以前不需要的密码传递给JSSE,以便它可以访问您的个人证书。
要创建KeyStore,请按照第1节中的步骤,用keyStore替换trustStore ,直到添加CA证书为止。 此时,请完成以下步骤:
选中标签密钥数据库内容下的下拉框。 选择个人证书 :与创建队列管理器个人证书不同,对必须使用的密钥标签没有限制。
输入如上所示的详细信息。 单击确定完成。设置keyStore的最后一部分是将您的证书或CA证书添加到Queue Managers密钥存储库,以便在客户端发送其证书时,Queue Manager可以对其进行验证。 以下是从keyStore中提取证书的方法,以便可以将其添加到Queue Managers密钥存储库中:
选中标签密钥数据库内容下的下拉框。 选择“ 个人证书” 。 选择您的证书。 点击提取证书 。完成此任务后,只需将其添加到Queue Managers存储库中即可。
您可以使用应用程序内设置的系统属性或命令行上的-D标志,将trustStore和KeyStore的位置传递给JSSE。 要在应用程序中设置它们,请使用下面的代码。 trustStore和keyStore的位置可以指向同一文件:
System.setProperty("javax.net.ssl.trustStore","<location of trustStore>"); System.setProperty("javax.net.ssl.keyStore","<location of keyStore>"); System.setProperty("javax.net.ssl.keyStorePassword","<password>");要使用-D标志:
java -Djavax.net.ssl.trustStore=<location of trustStore> -Djavax.net.ssl.keyStore=<location of keyStore> -Djavax.net.ssl.keyStorePassword=<password><app>您希望连接的通道应定义一个CipherSpec 。 内的Java / JMS应用程序中的CipherSuite必须指定的相匹配CipherSpec 。 下表将帮助您做到这一点:
密码规范和密码套件 密码规范 密码套件 NULL_MD5 SSL_RSA_WITH_NULL_MD5 NULL_SHA SSL_RSA_WITH_NULL_SHA RC4_MD5_EXPORT SSL_RSA_EXPORT_WITH_RC4_40_MD5 RC4_MD5_US SSL_RSA_WITH_RC4_128_MD5 RC4_SHA_US SSL_RSA_WITH_RC4_128_SHA RC2_MD5_EXPORT SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 DES_SHA_EXPORT SSL_RSA_WITH_DES_CBC_SHA RC4_56_SHA_EXPORT1024 SSL_RSA_EXPORT1024_WITH_RC4_56_SHA DES_SHA_EXPORT1024 SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA TRIPLE_DES_SHA_US SSL_RSA_WITH_3DES_EDE_CBC_SHA TLS_RSA_WITH_AES_128_CBC_SHA SSL_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA SSL_RSA_WITH_AES_256_CBC_SHA AES_SHA_US TLS_RSA_WITH_DES_CBC_SHA SSL_RSA_WITH_DES_CBC_SHA TLS_RSA_WITH_3DES_EDE_CBC_SHA SSL_RSA_WITH_3DES_EDE_CBC_SHA FIPS_WITH_DES_CBC_SHA SSL_RSA_FIPS_WITH_DES_CBC_SHA FIPS_WITH_3DES_EDE_CBC_SHA SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA您可以在许多地方指定CipherSuite 。
如果使用的是MQ Java Client,则可以在MQEnvironment.SSLCipherSuite:指定字符串MQEnvironment.SSLCipherSuite:
MQEnvironment.sslCipherSuite = "SSL_RSA_WITH_NULL_MD5";您还可以使用键MQC.SSL_CIPHER_SUITE_PROPERTY将哈希表中的字符串传递给QueueManager构造函数或MQEnvironment.properties哈希表:
MQEnvironment.properties.put(MQC.SSL_CIPHER_SUITE_PROPERTY, "SSL_RSA_WITH_NULL_MD5");要么:
Hashtable properties = new Hashtable(); properties.put(MQC.SSL_CIPHER_SUITE_PROPERTY, "SSL_RSA_WITH_NULL_MD5"); MQQueueManager myQM = new MQQueueManager("MyQMgr", properties);如果使用的是MQ JMS客户端,则可以使用setSSLCipherSuite()方法在连接工厂上设置CipherSuite :
MQConnectionFactory factory = new MQConnectionFactory(); factory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP); factory.setQueueManager("MyQMgr"); factory.setSSLCipherSuite("SSL_RSA_WITH_NULL_MD5"); factory.setPort(1414); factory.setHostName("127.0.0.1"); MQConnection connection = factory.createConnection();本文向您展示了如何:
创建一个TrustStore并将Queue Managers证书导入其中。 创建一个密钥库,其中保存已创建的测试证书。 将它们分配给您的应用程序,并配置Websphere MQ JMS客户端以使用它们。翻译自: https://www.ibm.com/developerworks/websphere/library/techarticles/0510_fehners/0510_fehners.html
相关资源:Java下操作IBM Websphere MQ的项目案例