Websphere MQ Java/JMS 客户端的 SSL 配置

发表于:2007-06-23来源:作者:点击数: 标签:
本文不仅向您展示了如何配置从 Java/JMS 客户端到 IBM WebSphere MQ Queue Manager 的 安全 套接字层连接,而且还介绍了 测试 证书的创建(但没有介绍任何 MQ 配置信息)。本文是一篇纯粹的 Java/JMS 客户端指南文章,文中还需要使用到 IBM SDK。 文中的第 1

   

本文不仅向您展示了如何配置从 Java™/JMS 客户端到 IBM® WebSphere® MQ Queue Manager 的安全套接字层连接,而且还介绍了测试证书的创建(但没有介绍任何 MQ 配置信息)。本文是一篇纯粹的 Java/JMS 客户端指南文章,文中还需要使用到 IBM SDK。

文中的第 1 步、第 3 步和第 4 步需要配置 SSL 连接。如果希望配置客户端身份验证,执行第 2 步即可。为了降低复杂性并简化任何潜在问题的调试,我不推荐在一开始就使用客户端身份验证。在拥有了基本的 SSL 连接后,就可以配置客户端身份验证了。

如果在操作过程中遇到配置问题,这可能有助于指定调试标志:-Djavax.net.debug=true



Websphere MQ Java/JMS 客户端的 SSL 配置(图一)


1. 创建 trustStore

顾名思义,trustStore 持有您所信任的 Queue Manager 签名 CA 所颁发的证书。这意味着当 Java/JMS 客户端连接到 Queue Manager 时,它需要将其证书发送给我们作为初始 SSL 握手的一部分。负责处理所有 SSL 通信的 Java Secure Socket Extension (JSSE) 将通过查找 trustStore 来验证刚刚发送的证书。如果无法验证该证书,则连接将被终止。

要创建 trustStore 并导入证书,您可以使用 IBM Key Management 工具,该工具是 Websphere MQ V6 的一部分:

  1. 在“开始”栏中,选择 Programs => IBM Websphere MQ => IBM Key Management
  2. 当 IBM Key Management 启动后,单击 New 并设置下列值:
    Key database type
    JKS
    File name
    trustStore
    Location
    所选择的位置
  3. 单击 OK 继续。

    图 1

    Websphere MQ Java/JMS 客户端的 SSL 配置(图二)

  4. 系统现在提示您输入所选择的密码。该密码只在您希望打开 trustStore 并添加证书到其中时才需要用到。如果 JSSE 只用作 trustStore,那么它不需要使用密码。在本例中,请输入密码。
  5. 单击 OK 继续。到现在为止,应该已创建了 trustStore,您可以把信任的 CA 所颁发的证书导入其中。
  6. 选择标签 Key database content 下方的下拉框。
  7. 选择 Signer Certificates

    图 2

    Websphere MQ Java/JMS 客户端的 SSL 配置(图三)

  8. 单击 Add。系统将提示您选择希望添加的证书的位置。该证书可以是 Queue Manager 证书(如果您正在为测试使用自签证书),也可以是 CA(为您颁发 Queue Manager 证书)颁发的证书。有关为 SSL 配置 Queue Manager 的信息,请参阅 MQ Security 手册的第 13 章。
  9. 请输入下列数据:
    Data type
    二进制 DER 数据
    Certificate file name
    <Queue Manager 证书的名称>
    Location
    <证书位置>
  10. 单击 OK。系统将提示您输入一个标签,其格式应该为:<ibmwebspheremq<qmname lowercase>
  11. 单击 OK 添加该证书。


Websphere MQ Java/JMS 客户端的 SSL 配置(图一)




2. 创建 keyStore

连接到 Queue Manager 后,如果您希望创建客户端身份验证,请完成这一部分的操作。如果还未在该通道上指定客户端身份验证,则不需要完成这一部分所描述的操作。

keyStore 在本质上与 trustStore 相同,但它还持有客户端的个人证书,并且 JSSE 需要使用密码访问。实际上,您可以把个人证书添加到刚才创建的 trustStore 中,它既可以用于 trustStore 也可以用于 keyStore,但以前不需要设置的密码现在需要传递给 JSSE,以使它能够访问您的个人证书。

要创建 keyStore,请按照第 1 部分的步骤(使用 keyStore 替换 trustStore)一直执行到添加 CA 证书,然后继续完成以下步骤:

  1. 选择标签 Key database content 下方的下拉框。
  2. 选择 Personal Certificates

    图 3

    Websphere MQ Java/JMS 客户端的 SSL 配置(图四)

  3. 单击 New Self-Signed 为自己创建测试证书。
  4. 如果您已经拥有颁发的证书,则单击 Receive 来添加该证书:

    图 4

    Websphere MQ Java/JMS 客户端的 SSL 配置(图五)

    与创建 Queue Manager 个人证书不同,这里对于必须使用的 Key Label 没有任何限制。

  5. 按图 4 输入相关的详细信息。
  6. 单击 OK 完成。

设置 keyStore 的最后工作是将您的证书或 CA 证书添加到 Queue Manager 密钥储存库中,这样当客户端发送其证书时,Queue Manager 就能够验证该证书。下面介绍了如何从 keyStore 提取您的个人证书,这样您就可以将其添加到 Queue Managers 密钥储存库中:

  1. 选择标签 Key database content 下方的下拉框。
  2. 选择 Personal Certificates
  3. 选择您的证书。
  4. 单击 Extract Certificate

    图 5

    Websphere MQ Java/JMS 客户端的 SSL 配置(图六)

  5. 输入证书名称。
  6. 指定一个位置。
  7. 单击 OK 完成。

一旦完成该任务后,您所需做的就是将该证书添加到 Queue Managers 密钥储存库中。



Websphere MQ Java/JMS 客户端的 SSL 配置(图一)




CC>3. 为应用程序分配 trustStore 和 keyStore

您可以使用在应用程序内部设置的系统属性,或在命令行中设置的 -D 标志将 trustStore 和 keyStore 的位置传递给 JSSE。要在应用程序内部设置它们的位置,请使用下面的代码。trustStorekeyStore 的位置可以指向一个相同的文件:


         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>


Websphere MQ Java/JMS 客户端的 SSL 配置(图一)




4. 配置 CipherSuite

您希望连接的通道应该具有定义的 CipherSpec。在 Java/JMS 应用程序内部,需要指定与 CipherSpec 相匹配的 CipherSuite。下面的表格将帮您完成这一任务:

CipherSpec CipherSuite
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 客户端 (MQ Java Client),您可以在 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();

原文转自:http://www.ltesting.net