安装 SecurityManager 时 MQQueueManager 构造函数挂起
MQQueueManager constructor hangs when a SecurityManager is installed
主机 foo 是一个 IBM MQ 客户端(即通过 TCP/IP 的客户端模式连接)。主机栏是队列管理器所在的系统 运行ning。 Bar 授予 foo 实例化 com.ibm.mq.MQQueueManager 对象的权限(通过 IP 地址),但不授予主机 foobar 的权限。
因此,我将所有 IBM MQ 联系人封装到 foo 上的新应用程序 运行ning 中。与 foobar 一起,一个 client/server 应用程序正在形成,使用套接字,其中 foo 是服务器,foobar 是客户端。和以前一样,Foo 仍然是 IBM MQ 客户端。
到目前为止,我在新应用程序(与 MQ 相关)中尝试对 foo 执行的所有操作都是实例化 MQQueueManager 对象。那就成功了,直到我引入java.lang.SecurityManager.
通过 java 命令执行的本地应用程序(例如 foo 上的这个应用程序)默认情况下未 运行 安装 SecurityManager。现在 运行 安装了 SecurityManager。原因是为了控制对 foo 上此应用 运行ning 的访问。安全策略接受来自 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] ...
But we’re getting some interference in the interaction between foo and
bar. The interference is coming from the SecurityManager. Don’t run
with a SecurityManager installed and foo can instantiate
MQQueueManager. Run with a SecurityManager and foo hangs in the
MQQueueManager constructor.
这很奇怪。 MQ 文档中的哪里说要使用 Java SecurityManager。有人给了你不好的信息。此外,您不使用 SecurityManager 进行 MQ 安全。
The following permission on foo results in the MQQueueManager constructor hanging.
permission java.net.SocketPermission "bar", "connect, accept";
为什么要限制 MQ 客户端库的功能?如果它不能侦听和解析 tcp 通信,那么它将无法工作。只需删除该行。
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 系统 属性 为 Java 跟踪 IBM MQ 类:
-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"
主机 foo 是一个 IBM MQ 客户端(即通过 TCP/IP 的客户端模式连接)。主机栏是队列管理器所在的系统 运行ning。 Bar 授予 foo 实例化 com.ibm.mq.MQQueueManager 对象的权限(通过 IP 地址),但不授予主机 foobar 的权限。
因此,我将所有 IBM MQ 联系人封装到 foo 上的新应用程序 运行ning 中。与 foobar 一起,一个 client/server 应用程序正在形成,使用套接字,其中 foo 是服务器,foobar 是客户端。和以前一样,Foo 仍然是 IBM MQ 客户端。
到目前为止,我在新应用程序(与 MQ 相关)中尝试对 foo 执行的所有操作都是实例化 MQQueueManager 对象。那就成功了,直到我引入java.lang.SecurityManager.
通过 java 命令执行的本地应用程序(例如 foo 上的这个应用程序)默认情况下未 运行 安装 SecurityManager。现在 运行 安装了 SecurityManager。原因是为了控制对 foo 上此应用 运行ning 的访问。安全策略接受来自 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] ...
But we’re getting some interference in the interaction between foo and bar. The interference is coming from the SecurityManager. Don’t run with a SecurityManager installed and foo can instantiate MQQueueManager. Run with a SecurityManager and foo hangs in the MQQueueManager constructor.
这很奇怪。 MQ 文档中的哪里说要使用 Java SecurityManager。有人给了你不好的信息。此外,您不使用 SecurityManager 进行 MQ 安全。
The following permission on foo results in the MQQueueManager constructor hanging. permission java.net.SocketPermission "bar", "connect, accept";
为什么要限制 MQ 客户端库的功能?如果它不能侦听和解析 tcp 通信,那么它将无法工作。只需删除该行。
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 系统 属性 为 Java 跟踪 IBM MQ 类:
-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"