Java 带有安全管理器的Tomcat 9.0报告Windows上的访问被拒绝

Java 带有安全管理器的Tomcat 9.0报告Windows上的访问被拒绝,java,tomcat,java-security,securitymanager,tomcat9,Java,Tomcat,Java Security,Securitymanager,Tomcat9,我在Windows 10上启动Tomcat 9.0时使用了: -Djava.security.manager -Djava.security.policy==C:\Program Files\Apache Software Foundation\Tomcat 9.0\conf\catalina.policy -Djava.security.debug=access,failure 使用带有启用ssl的org.apache.coyote.http11.Http11Nio2Protocol类型的连

我在Windows 10上启动Tomcat 9.0时使用了:

-Djava.security.manager
-Djava.security.policy==C:\Program Files\Apache Software Foundation\Tomcat 9.0\conf\catalina.policy
-Djava.security.debug=access,failure
使用带有启用ssl的org.apache.coyote.http11.Http11Nio2Protocol类型的连接器

此外,我只有(我自己的)根应用程序正在运行,其他什么都没有

在catalina.policy中,我定义了(第一次测试):

现在检查tomcat9-stderr.log时,我发现以下条目:

access: access denied ("java.util.PropertyPermission" "org.apache.juli.logging.UserDataHelper.CONFIG" "read")

java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Unknown Source)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPropertyAccess(Unknown Source)
at java.lang.System.getProperty(Unknown Source)
at org.apache.tomcat.util.log.UserDataHelper.<init>(UserDataHelper.java:57)
at org.apache.coyote.AbstractProcessor.<init>(AbstractProcessor.java:90)
at org.apache.coyote.http2.StreamProcessor.<init>(StreamProcessor.java:56)
at org.apache.coyote.http2.Http2UpgradeHandler.processStreamOnContainerThread(Http2UpgradeHandler.java:261)
at org.apache.coyote.http2.Http2UpgradeHandler.headersEnd(Http2UpgradeHandler.java:1356)
at org.apache.coyote.http2.Http2AsyncUpgradeHandler.headersEnd(Http2AsyncUpgradeHandler.java:37)
at org.apache.coyote.http2.Http2Parser.onHeadersComplete(Http2Parser.java:583)
at org.apache.coyote.http2.Http2Parser.readHeadersFrame(Http2Parser.java:272)
at org.apache.coyote.http2.Http2AsyncParser$FrameCompletionHandler.completed(Http2AsyncParser.java:167)
at org.apache.coyote.http2.Http2AsyncParser$FrameCompletionHandler.completed(Http2AsyncParser.java:85)
at org.apache.tomcat.util.net.Nio2Endpoint$Nio2SocketWrapper$VectoredIOCompletionHandler.completed(Nio2Endpoint.java:1148)
at org.apache.tomcat.util.net.Nio2Endpoint$Nio2SocketWrapper$VectoredIOCompletionHandler.completed(Nio2Endpoint.java:1117)
at org.apache.tomcat.util.net.SecureNio2Channel$2.completed(SecureNio2Channel.java:1047)
at org.apache.tomcat.util.net.SecureNio2Channel$2.completed(SecureNio2Channel.java:992)
at sun.nio.ch.Invoker.invokeUnchecked(Unknown Source)
at sun.nio.ch.Invoker$2.run(Unknown Source)
at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

access: domain that failed ProtectionDomain  null
 null
 <no principals>
 null
在catalina.policy文件的不同位置(对于webapps/ROOT/、catalina代码权限、WEB应用程序权限)

但所有这些都不会让这两个被拒绝的访问消失

所以我的问题是如何清理这两个拒绝进入的人

更新1

对于accessClassInPackage.org.apache.tomcat.util.net,我想知道为什么会发生这种情况,因为org.apache.tomcat.util.net位于tomcat/lib/tomcat-coyote.jar中,它从以下位置获得了权限:

grant codeBase "file:${catalina.home}/lib/-" {
  permission java.security.AllPermission;
};
更新2

改变

-Djava.security.policy=

这让

access denied ("java.lang.RuntimePermission" "accessClassInPackage.org.apache.tomcat.util.net")
消失-因此,只有朱莉日志仍然被拒绝

更新3

现在我得到了一个额外的例外:

access: access denied ("java.net.SocketPermission" "127.0.0.1:15484" "accept,resolve")
11-Feb-2019 14:46:43.895 SCHWERWIEGEND [https-openssl-nio2-443-exec-7] org.apache.tomcat.util.net.Nio2Endpoint$Nio2Acceptor.failed Socket accept failed
 java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:15478" "accept,resolve")
    at java.security.AccessControlContext.checkPermission(Unknown Source)
    at java.security.AccessController.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkPermission(Unknown Source)
    at java.lang.SecurityManager.checkAccept(Unknown Source)
    at sun.nio.ch.WindowsAsynchronousServerSocketChannelImpl$AcceptTask$1.run(Unknown Source)
    at sun.nio.ch.WindowsAsynchronousServerSocketChannelImpl$AcceptTask$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.nio.ch.WindowsAsynchronousServerSocketChannelImpl$AcceptTask.finishAccept(Unknown Source)
    at sun.nio.ch.WindowsAsynchronousServerSocketChannelImpl$AcceptTask.completed(Unknown Source)
    at sun.nio.ch.Iocp$EventHandlerTask.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    at sun.misc.InnocuousThread.run(Unknown Source)
这很奇怪,因为

org.apache.tomcat.util.net.Nio2Endpoint

tomcat/lib/tomcat-coyote.jar
它应该没有任何限制

grant codeBase "file:${catalina.home}/lib/-" {
    permission java.security.AllPermission;
};
更奇怪的是,这一次之后是:

access: access allowed ("java.net.SocketPermission" "127.0.0.1:15485" "accept,resolve")
这让整个事情变得更加神秘


顺便说一句,UserDataHelper似乎也是如此,除了拒绝访问之外,还允许访问。

在我们的应用程序中观察到类似的问题。catalina策略中的安全设置对代码没有任何影响;更重要的是,对我们来说,它是断断续续的

我们在catalina调试模式中进行了大量挖掘(这有助于逐步调试catalina线程)

通过将server.xml中的连接器更改为org.apache.coyote.http11.Http11NioProtocol(NIO的第一个版本,而不是NIO2),我们解决了这个问题

在幕后创建多个异步线程时,我们不知何故觉得NIO2搞乱了安全策略


其他版本的Tomcat报告并修复了类似问题。Tomcat版本6.0.29--。Tomcat版本8.0.47–使用NIO解决问题--&
org.apache.tomcat.util.net.Nio2Endpoint
tomcat/lib/tomcat-coyote.jar
grant codeBase "file:${catalina.home}/lib/-" {
    permission java.security.AllPermission;
};
access: access allowed ("java.net.SocketPermission" "127.0.0.1:15485" "accept,resolve")