【问题标题】:New java.security.AccessControlException in Java 8Java 8 中的新 java.security.AccessControlException
【发布时间】:2014-06-05 01:27:03
【问题描述】:

以前工作的网络代码正在抛出java.security.AccessControlException 在完全沙盒化的 Java applet.

Can't get socket 2255: java.security.AccessControlException: access denied ("java.net.SocketPermission" "50.31.1.13:2255" "connect,resolve")

Oracle 发生了什么变化 - 必须跳到什么新的安全圈 保持套接字正常工作?

这在 Java 1.7.0_55 和所有以前的 java 版本中有效/有效。

【问题讨论】:

  • 抛出异常的具体代码是什么?
  • 部分解决方法是将小程序权限从沙盒更改为所有权限。客户必须点击的警告只是有点吓人。

标签: java security sockets


【解决方案1】:

这确实发生了变化……来自文档

http://docs.oracle.com/javase/8/docs/technotes/guides/jweb/enhancements-8.html

  • 对于沙盒 RIA,URLPermission 现在用于允许连接回到启动它们的服务器。 URLPermissions 是根据代码源的协议、主机和端口授予的。此更改具有以下含义:

    • 对于沙盒 RIA,不再授予源主机的 SocketPermissions。从 JDK 8 开始,不允许从 JavaScript 代码调用 RIA SocketPermissions

换句话说,您不能再在沙盒中创建新的Socket。然后,您只能使用与完全沙盒小程序中的代码库相同的主机、相同的端口相同的协议来创建URL

除非 Oracle 改变主意,否则沙盒小程序无法解决此问题(否则会破坏整个安全概念)。

【讨论】:

  • 天知道为什么小程序功能的新降级隐藏在“增强”部分。不允许使用 HTTP 或 HTTPS 协议从特定端口上的服务器加载的沙盒 RIA 连接回服务器上的其他端口。例如,如果 RIA 从 example.com:80 启动,则不允许 RIA 连接回 example.com:8888
  • 很可能是因为他们没有“降级”部分,也永远不会创建。在过去受到负面新闻之后,他们似乎在安全问题上反应过度。应该更加小心地处理已经工作了近 20 年的事情,并且在没有提供替代方案的情况下绝不应该这样做……(恕我直言)
  • 这似乎是一个可怕的变化。是否有任何地方的错误报告/请愿书要求扭转这一点?
  • @Richard Kennard:我不知道。但您可以自行搜索,因为我不会一直监控问题。
【解决方案2】:

嗯,对我来说,甲骨文似乎决定加强小程序的安全要求。这是我在CodeRanch 上找到的:

使SecurityManager接受与套接字相关的权限检查:

System.getSecurityManager().checkPermission(new SocketPermission("50.31.1.13:2255", "accept, connect, listen"));
//I used IP address from your exception

现在,线程相关的检查:

System.getSecurityManager().checkPermission(new RuntimePermission("readerThread"));

这些行应该放在main() 方法的开头。

需要做的第二件事是签署您的jar/war/ear 文件。首先,创建一个密钥库:

keytool -genkey -alias philip -keystore keystore  

现在,将 CA 签名的证书放入您的信任库证书中或创建自签名证书:

keytool -selfcert -alias philip -keystore keystore 

最后,签署文件:

jarsigner -keystore keystore -signedjar WhatYouWantTheSignedJarToBeNamed.jar ThePreviousJARYouCreated.jar philip   

实际上对于已签名的JAR 文件,SecurityManager 相关的魔法可能是开销,但我认为两者都做更安全。

另外请注意,有时您可能需要签署外部jars,而不仅仅是您的小程序所在的jar

【讨论】:

  • 有问题的 jars 已完全签名,这是以前的安全措施所要求的。此新投诉适用于 SANDBOXED 小程序,以前不需要任何特殊权限即可连接到下载服务器。
  • @ddyer 好的,也许很明显,但仍然:Oracle 说小程序只能连接到它来自的主机。 50.31.1.13是同一个主机吗?
  • 当然。这个故障至少破坏了 3 个当前使用 java 1.7.0_55 的站点
  • @ddyer 好吧.. 确定主机是否真的相同可能存在一些问题。可以使用域名吗? jvm with applet 与服务器之间是否存在可疑的 DNS 服务器或 NAT?
  • 底层代码确实使用了域名,服务端或者客户端都没有什么异常。这一切都已经工作多年了。
【解决方案3】:

在client.policy(对于应用程序客户端)或server.policy(对于Web模块)中为需要设置属性的应用程序添加权限。默认情况下,应用程序只有属性的读取权限。

例如,要授予对代码库目录中所有文件的读/写权限,请将以下内容添加或附加到 client.policy 或 server.policy:

grant codeBase "file:/.../build/sparc_SunOS/sec/-" { 权限 java.util.PropertyPermission "*", "read,write"; };

【讨论】:

  • 投诉来自尝试使用套接字建立网络连接。它与访问用户机器无关。这是 java 8 中的新行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 2011-01-10
  • 2021-10-19
相关资源
最近更新 更多