簡體   English   中英

Java 8中的新java.security.AccessControlException

[英]New java.security.AccessControlException in Java 8

以前工作的網絡代碼將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中都有效。

這確實發生了變化......來自文檔

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改變主意,否則沙盒applet無法解決這個問題(否則會導致整個安全概念被破壞)。

好吧,對我而言,聽起來Oracle決定加強applet的安全性要求。 這是我在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相關的魔法可能是一個開銷,但在我看來,這兩者都更安全。

另外請注意,有時您可能需要簽署外部jar ,而不僅僅是applet所在的jar

在client.policy(對於應用程序客戶端)中,或在server.policy(對於Web模塊)中為需要設置屬性的應用程序添加權限。 默認情況下,應用程序僅具有屬性的讀取權限。

例如,要為codebase目錄中的所有文件授予讀/寫權限,請將以下內容添加或附加到client.policy或server.policy:

grant codeBase“file:/.../ build / sparc_SunOS / sec / - ”{permission java.util.PropertyPermission“*”,“read,write”; };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM