安装SecurityManager时,MQQueueManager构造函数挂起

时间:2018-06-06 17:16:04

标签: java ibm-mq securitymanager

Host foo是IBM MQ客户端(即通过TCP / IP的客户端模式连接)。主机栏是运行队列管理器的系统。 Bar授予foo实例化com.ibm.mq.MQQueueManager对象的权限(通过IP地址),但不授予托管foobar的权限。

因此,我将所有IBM MQ联系人封装到在foo上运行的新应用程序中。与foobar一起,使用套接字形成客户端/服务器应用程序,其中foo是服务器而foobar是客户端。与以前一样,Foo仍然是IBM MQ客户端。

到目前为止,我在新应用程序(与MQ相关)中尝试对foo做的就是实例化一个MQQueueManager对象。这很成功,直到我介绍java.lang.SecurityManager。

通过java命令执行的本地应用程序,例如foo上的这个应用程序,默认情况下不会在安装了SecurityManager的情况下运行。现在它安装了SecurityManager。原因是控制对在foo上运行的此应用程序的访问。安全策略接受来自foobar(java.net.SocketPermission)的连接。这有效。 foo的所有者现在可以控制授予foobar的权限。

但是我们对foo和bar之间的相互作用产生了一些干扰。干扰来自SecurityManager。不要在安装了SecurityManager的情况下运行,并且foo可以实例化MQQueueManager。使用SecurityManager运行并且foo在MQQueueManager构造函数中挂起。

Foo正在使用https://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html

中描述的策略参考实现

foo的以下权限导致MQQueueManager构造函数挂起。

permission java.net.SocketPermission "bar", "connect, accept";

-Dcom.ibm.msg.client.commonservices.trace.status=ON

-Djava.security.debug="access,failure"

... access denied ("java.util.PropertyPermission" "mqs.disable.all.intercept" "read") [java.security.AccessControlException] ...

... access denied ("java.util.PropertyPermission" "mqs.intercept.serializeconn" "read") [java.security.AccessControlException] ...

2 个答案:

答案 0 :(得分:1)

IBM MQ v8 KC有一个页面" Running IBM MQ classes for Java applications under the Java Security Manager"。

此页面说明与MQ客户端连接有关:

//For the client transport type.
permission java.net.SocketPermission "*","connect,resolve";

我唯一注意到的是上面示例中与您发布的内容相比缺少空格,您也不需要提供accept权限,我还在sun文档中注意到resolve隐含connect所以不应该特别需要。

有很多其他设置与您可能需要的其他权限相关,因此我建议您查看上面的详细信息。

您可以使用以下java系统属性获取IBM MQ Classes for Java跟踪:

-Dcom.ibm.msg.client.commonservices.trace.status=ON

默认情况下,跟踪将输出到当前目录中名为mqjms_%PID%.trc的文件,%PID%被java进程的进程ID替换。

如果要指定其他文件名或路径,可以添加以下java系统属性:

-Dcom.ibm.msg.client.commonservices.trace.outputName=/tmp/x/y/z/mqjms_%PID%.trc 

两个示例命令:

java -Dcom.ibm.msg.client.commonservices.trace.status=ON -Dcom.ibm.msg.client.commonservices.trace.outputName=mqjms_%PID%.trc SomeJavaApp

java安全管理器跟踪可能会有所帮助,您可以通过添加以下java系统属性来启用它:

-Djava.security.debug="access,failure"

答案 1 :(得分:0)

  

但是我们对foo和foo之间的相互作用产生了一些干扰   酒吧。干扰来自SecurityManager。不要跑   安装了SecurityManager,foo可以实例化   MQQueueManager。使用SecurityManager运行并且foo挂起   MQQueueManager构造函数。

这很奇怪。它在MQ文档中的位置表示使用Java SecurityManager。有人给你不好的信息。此外,您不使用SecurityManager执行MQ安全性。

  

foo的以下权限导致MQQueueManager构造函数挂起。   权限java.net.SocketPermission“bar”,“connect,accept”;

为什么要限制MQ客户端库可以执行的操作?如果它听不到&解决tcp通信然后它将无法正常工作。只需删除该行。