使用SSL连接到Tibco EMS时出现javax.crypto.BadPaddingException

时间:2014-07-10 12:45:50

标签: java ssl jms weblogic tibco

此主题是之前案例的延续: How to setup JMS bridge to ActiveMQ on Weblogic 11g 但现在使用Tibco作为源JMS桥目的地。

尝试从JMS网桥配置连接到Tibco EMS时出现以下错误:

javax.jms.JMSSecurityException: Error occured while reading identity data: failed to decrypt safe contents entry: javax.crypto.BadPaddingException: Given final block not properly padded
at com.tibco.tibjms.TibjmsSSL._identityFromStore(TibjmsSSL.java:2664)
at com.tibco.tibjms.TibjmsSSL.createIdentity(TibjmsSSL.java:2569)
at com.tibco.tibjms.TibjmsxLinkSSL._initSSL(TibjmsxLinkSSL.java:309)
at com.tibco.tibjms.TibjmsxLinkSSL.connect(TibjmsxLinkSSL.java:390)
at com.tibco.tibjms.TibjmsConnection._create(TibjmsConnection.java:1274)
at com.tibco.tibjms.TibjmsConnection.<init>(TibjmsConnection.java:4100)
at com.tibco.tibjms.TibjmsQueueConnection.<init>(TibjmsQueueConnection.java:36)
at com.tibco.tibjms.TibjmsxCFImpl._createImpl(TibjmsxCFImpl.java:200)
at com.tibco.tibjms.TibjmsxCFImpl._createConnection(TibjmsxCFImpl.java:253)
at com.tibco.tibjms.TibjmsQueueConnectionFactory.createQueueConnection(TibjmsQueueConnectionFactory.java:87)
at weblogic.jms.adapter.JMSBaseConnection.startInternal(JMSBaseConnection.java:364)
at weblogic.jms.adapter.JMSBaseConnection.start(JMSBaseConnection.java:244)
at weblogic.jms.adapter.JMSManagedConnectionFactory.createManagedConnection(JMSManagedConnectionFactory.java:190)

jndi.properties内容:

com.tibco.tibjms.naming.security_protocol=ssl
com.tibco.tibjms.naming.ssl_enable_verify_host=false
com.tibco.tibjms.naming.ssl_enable_verify_hostname=false
com.tibco.tibjms.naming.ssl_vendor=j2se
com.tibco.tibjms.naming.ssl_expected_hostname=test
com.tibco.tibjms.naming.ssl_identity=/home/oracle/keys/test.p12
com.tibco.tibjms.naming.ssl_password=pass

#DEBUG
com.tibco.tibjms.naming.ssl_trace=true
com.tibco.tibjms.naming.ssl_debug_trace=true

com.tibco.tibjms.debug=true
com.tibco.tibjms.ssl.debug.trace=true
com.tibco.tibjms.ssl.trace=true

编辑: 我已经达到了例外的根本原因:

// sun.security.rsa.RSAPadding.unpadV15()
if (paramArrayOfByte[(i++)] != 0) {
    throw new BadPaddingException("Data must start with zero"); 
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

一段时间后问题得到了解决。案例是私人密码的密码没有提供给Tibco客户端。

可以通过以下方式完成:

com.tibco.tibjms.TibjmsSSL.setPassword(pass)

但是仍然不清楚如何在托管环境中解决此问题,例如Mule ESB连接器或Weblogic桥接配置,其中您仅使用元数据/配置定义客户端...欢迎任何评论。

答案 1 :(得分:0)

您需要了解连接到TIBCO EMS有两个阶段(如果只使用私有API,当然可以是一步),第一个是创建与EMS的JNDI连接并查找connectionfactory定义,这是您在jndi.properties中设置的属性变得有用。

查找返回后,可以使用检索到的ConnectionFactory对象创建实际连接。您面临的问题是在此阶段没有为客户端私钥提供密码。

如果您已阅读文档,EMS将尝试使用您传递给ConnectionFactory.createConnection的密码(String userName,String password)。应该有一个位置/属性文件,您可以在这些文件中为这些托管环境中的ConnectionFactory.createConnection()设置密码。

我想这是避免在托管环境中调用私有API(如com.tibco.tibjms.TibjmsSSL.setPassword(pass))的唯一方法。