[英]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.