Java安全访问控制异常:拒绝访问("java.net.SocketPermission" "localhost:1527" "listen,resolve")

5

我又要面对这个错误了。

Fri Sep 16 17:17:29 CEST 2016 : access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkListen(SecurityManager.java:1131)
    at java.net.ServerSocket.bind(ServerSocket.java:374)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:231)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.createServerSocket(Unknown Source)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.access$000(Unknown Source)
    at org.apache.derby.impl.drda.NetworkServerControlImpl$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.blockingStart(Unknown Source)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.executeWork(Unknown Source)
    at org.apache.derby.drda.NetworkServerControl.main(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.enterprise.admin.cli.optional.DerbyControl.invokeNetworkServerControl(DerbyControl.java:158)
    at com.sun.enterprise.admin.cli.optional.DerbyControl.main(DerbyControl.java:245)
java.security.AccessControlException: access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
    at java.security.AccessController.checkPermission(AccessController.java:884)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkListen(SecurityManager.java:1131)
    at java.net.ServerSocket.bind(ServerSocket.java:374)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at javax.net.DefaultServerSocketFactory.createServerSocket(ServerSocketFactory.java:231)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.createServerSocket(Unknown Source)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.access$000(Unknown Source)
    at org.apache.derby.impl.drda.NetworkServerControlImpl$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.blockingStart(Unknown Source)
    at org.apache.derby.impl.drda.NetworkServerControlImpl.executeWork(Unknown Source)
    at org.apache.derby.drda.NetworkServerControl.main(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.sun.enterprise.admin.cli.optional.DerbyControl.invokeNetworkServerControl(DerbyControl.java:158)
    at com.sun.enterprise.admin.cli.optional.DerbyControl.main(DerbyControl.java:245)

这次我无法通过编辑java.policy文件来解决问题。
java -version的结果:
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)

我在以下路径发现java.policy文件:

/etc/java-8-openjdk/security
/usr/java/jdk1.8.0_25/jre/lib/security

两者都有行:

permission java.net.SocketPermission "localhost:1527", "listen,resolve";

我的电脑是Linux 16.04.01,服务器是Glassfish4。

还有其他可能的地方可以编辑java.policy文件吗? 还有其他可能的原因吗?

2个回答

8
首先,运行derby批处理文件sysinfo.bat以确定正在使用哪个JDK/JRE来运行它。如果您无法确定,请转到计算机的环境变量并检查JAVA_HOME的值。
然后,转到该JDK/JRE的\jre\lib\security文件夹并添加以下内容:
grant {
    permission java.net.SocketPermission "localhost:1527", "listen";
};

我尝试使用在~/glassfish4/glassifish/javadb/中找到的文件。这样正确吗?运行sysinfo.bat(这不仅适用于Windows机器吗?我有一台Linux机器)会出现错误。运行sysinf时,我会收到错误消息:无法找到或加载主类org.apache.derby.tools.sysinfo。运行“echo $JAVA_HOME”我什么也没有得到 :-( - sthor69
1
授予JRE安装的所有代码运行权限可能不是一个好主意。 - Tom Hawtin - tackline
是的。但由于它在给定端口上进行监听 - 默认的derby端口 - 如果您的计算机在防火墙后面,那么它不会太危险。但我接受您的观点。 - Sampada

1

谢谢您指出这个问题。我之前不知道。但是我的问题通过简单地重新启动服务器自行解决了。很难说原因是什么。 - sthor69

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接