【问题标题】:java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:8081 connect,resolve) - main reasonsjava.security.AccessControlException: 拒绝访问 (java.net.SocketPermission 127.0.0.1:8081 connect,resolve) - 主要原因
【发布时间】:2014-09-24 07:49:45
【问题描述】:

导致报异常的主要原因是什么?

相同的受信任签名小程序(Digicert 证书),在某些 PC 上运行良好,在其他 PC 上无法运行。当我尝试通过URLConnection获取附件流时发生异常

如果它不起作用,我会解决

grant { 
    permission java.security.AllPermission; 
};

java.policy
但我想避免更新每台 PC。

可能是port (8081) 问题?我应该调查什么?

【问题讨论】:

  • 这不是端口 8081 问题,而是证书问题。它不起作用的 PC 不信任或未接受签名证书。它是由证书颁发机构颁发的吗?
  • 是的,jar 由证书颁发机构签名。 PC 已接受证书

标签: java security applet


【解决方案1】:

相同的受信任签名小程序(Digicert 证书),在某些 PC 上运行良好,在其他 PC 上无法运行。

那些其他 PC 不信任它,并且在被询问时不被用户接受为受信任。

这是我的 manifest.mf

Trusted-Library: true
Application-Name: MyApp
Name: MyName
Permissions: all-permissions
Created-By: 1.6.0_16 (Sun Microsystems Inc.)
Caller-Allowable-Codebase: *
Main-Class: MyClass
Codebase: *

如果这是完整的清单,则此 JAR 根本没有签名,更不用说使用受信任的证书了。它应该充满Name:SHA-256-Digest 条目。

【讨论】:

    【解决方案2】:

    为您的小程序编写自定义SecurityManager 可以解决您的问题。设置您自己的SecurityManager 将授予您的小程序的所有权限。

    class customSecurityManager extends SecurityManager {
    
            SecurityManager original;
    
            customSecurityManager(SecurityManager original) {
                this.original = original;
            }
    
            /**
             * Deny permission to exit the VM.
             */
            public void checkExit(int status) {
                //throw(new SecurityException("Not allowed"));
            }
    
            /**
             * Allow this security manager to be replaced, if fact, allow pretty
             * much everything.
             */
            public void checkPermission(Permission perm) {
            }
    
            public SecurityManager getOriginalSecurityManager() {
                return original;
            }
        }
    

    现在为您的小程序设置此安全管理器

    public void init() {
       customSecurityManager cSM = new customSecurityManager(System.getSecurityManager());
       System.setSecurityManager(cSM);
    }
    

    注意Impact of System.setSecurityManager(null)

    【讨论】:

    • 如果他没有打开套接字的权限,他肯定没有更改安全管理器的权限。
    • 如果你设置了一个安全管理器,你就为进程中的所有小程序设置了它。可能不是一个好主意。一般来说,您希望避免使用全局变量。
    【解决方案3】:

    您必须在 manifest.mf 实例“sandbox”中添加“all-permissions”

    使用代码签名证书为您的 jar 文件签名。

    【讨论】:

    • 正如我所说,jar 文件是用 Digicert 证书签名的。这是我的 manifest.mf Trusted-Library: true Application-Name: MyApp Name: MyName Permissions: all-permissions Created-By: 1.6.0_16 (Sun Microsystems Inc.) Caller-Allowable-Codebase: * Main-Class: MyClass Codebase: *
    • 你的jar文件是sun签名的?
    • 不,由 DigiCert 提供。您的意思是我必须删除“创建者...”这一行吗?
    • 没有我的朋友。找到没有标志的同一个罐子。并由其他证书签名。
    • 并使用此解决方案: public void method() { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { // 如果您的小程序已签名,它将起作用 callWeb(); return null ; } }); } 私人无效 callWeb() { }
    【解决方案4】:

    转到 java jdk 和 ./jre/lib/security/ 的路径 打开 java 策略文件

    然后设置 SocketPermission 的授予权限 grant{ permission java.net.SocketPermission "localhost:8080", "connect,resolve"; } 然后重新启动并运行您的代码。

    【讨论】:

      猜你喜欢
      • 2015-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2015-08-13
      • 2015-09-11
      • 2015-02-23
      • 1970-01-01
      相关资源
      最近更新 更多