Java 8中的新java.security.AccessControlException

ddy*_*yer 7 java sockets security

以前工作的网络代码正在投入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")
Run Code Online (Sandbox Code Playgroud)

Oracle改变了什么 - 必须跳出哪些新的安全环以保持套接字工作?

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

Hol*_*ger 10

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

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

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

    • 对于沙盒RIA,SocketPermissions不再授予源主机.从SocketPermissionsJDK 8开始,不会从JavaScript代码到RIA的调用.

    ...

换句话说,您无法再Socket在沙箱中创建新内容.您只能URL使用完全沙盒的applet使用与代码库相同的主机,相同端口相同的协议创建.

除非Oracle改变主意,否则沙盒applet无法解决这个问题(否则会导致整个安全概念被破坏).


Ale*_*lev 1

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

进行SecurityManageraccept套接字相关的权限检查:

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

现在,与线程相关的检查:

System.getSecurityManager().checkPermission(new RuntimePermission("readerThread"));
Run Code Online (Sandbox Code Playgroud)

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

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

keytool -genkey -alias philip -keystore keystore  
Run Code Online (Sandbox Code Playgroud)

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

keytool -selfcert -alias philip -keystore keystore 
Run Code Online (Sandbox Code Playgroud)

最后,签署文件:

jarsigner -keystore keystore -signedjar WhatYouWantTheSignedJarToBeNamed.jar ThePreviousJARYouCreated.jar philip   
Run Code Online (Sandbox Code Playgroud)

实际上,对于签名JAR文件来说SecurityManager,与 - 相关的魔法可能是一种开销,但在我看来,两者都做更安全。

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