Java 要设置哪个权限,以避免使用https URL的Security Manager出错?

Java 要设置哪个权限,以避免使用https URL的Security Manager出错?,java,securitymanager,javapolicy,Java,Securitymanager,Javapolicy,在面向客户的软件中,我们必须读取给定的URL来解析其内容。客户还需要激活Tomcat Security Manager,让Java策略控制程序的功能 现在,在读取URL时,会发生异常“javax.net.ssl.SSLKeyException:RSA premaster secret error”,但仅在某些情况下: 如果URL是HTTPS,但不是HTTP 如果安全管理器已激活,而不是在其停用或 如果在全局授予块中,则设置AllPermission 仅适用于Java 6,不适用于Java 7(

在面向客户的软件中,我们必须读取给定的URL来解析其内容。客户还需要激活Tomcat Security Manager,让Java策略控制程序的功能

现在,在读取URL时,会发生异常“javax.net.ssl.SSLKeyException:RSA premaster secret error”,但仅在某些情况下:

  • 如果URL是HTTPS,但不是HTTP
  • 如果安全管理器已激活,而不是在其停用或 如果在全局授予块中,则设置AllPermission
  • 仅适用于Java 6,不适用于Java 7(客户当前需要Java 6)
  • 仅使用Tomcat6,不使用Tomcat7(客户当前需要Tomcat6)
安全违规发生在Java代码中的某个地方,仅限于我们的代码库的AllPermission并不能防止错误

那么,是否有人有想法,为Java6设置哪个权限,以便它可以处理HTTPS

其他信息:它在tomcat内部运行,在带有OpenJDK的DebianLinux上运行

编辑:我在变量Java_OPTS中向Tomcats/etc/default/tomcat6添加了Java参数“-Djava.security.debug=access,failure”。但是在日志中我没有其他消息。代码可能会在触发权限之前询问权限吗

EDIT2:我找到了正确的位置并获得了完整的stacktrace(删除了特定的客户部件):


错误发生在这条线上。这是Grails 2.2.4版。

发现所有必需权限的简单方法是使用参数运行

-Djava.security.debug=access,failure
然后,将向您提供有关每次失败的安全访问、有效的保护域等的完整信息。

解决方案经过几次评论和OP解决方案确认(摘要) 根本原因是多个位置存在
sunjce_provider.jar
。这是OP在被认为是许多可能的根本原因之一后发现的(见本答案的最后部分和评论线索)。根据OP的评论:

我在多个目录中有sunjce_provider.jar。我试图给Java 6的所有三个位置赋予权利,尽管很明显只有一个是Java_HOME,而且成功了。尽管java.ext.dirs-property中没有使用其他位置,但还是使用了其中一个位置

因此,本例中的解决方案是确保应用程序有权访问
sunjce_provider.jar的正确副本

我把我最初的答案中的要点和下面有助于诊断的评论留给了以后发现的人

最初的答案和意见导致了解决方案
  • 使用
    http
    时不会发生这种情况,因为您的web应用程序(即此连接的客户端,即使它在tomcat中运行)不需要在此配置中生成密钥

  • 它仅在启用SecurityManager时发生,但在禁用或使用全局AllPermission时不会发生,这表明它是一个文件权限错误。这表明键长度没有问题(例如1)

  • 其他报告指出,可能的根本原因是缺少jar(通常引用sunjce_provider.jar)。堆栈跟踪确认根本原因异常是
    NoSuchAlgorithmException
    ,其中
    KeyGenerator
    正在查找算法
    SunTlsRsaPremasterSecret
    ,但找不到它。在您的情况下,由于这只发生在特定的
    SecurityManager
    配置中,因此它可能是一个不可访问的jar(由于安全权限)

    我的猜测是,您没有启用
    grant codeBase
    对包含RSA keygen算法所需jar的正确目录的权限。我建议的做法是浏览您的webapp和JRE目录结构,找到运行时jar的存放位置,并确保它们在
    catalina.policy
    中拥有权限
    grant
    ed

    例如,在默认配置中,您应该看到

    // These permissions apply to all shared system extensions
    grant codeBase "file:${java.home}/jre/lib/ext/-" {
            permission java.security.AllPermission;
    };
    
    有关这意味着什么的详细信息,请参阅tomcat安全管理器的“How To”。您需要检查一些东西-确保运行时JAR所在的位置是
    ${java.home}/jre/lib/ext/
    。如果没有-更改路径以指向正确的位置(在我的OpenJDK 6-build 27版本中,路径位于正确的位置)。特别是,您应该在其中看到
    sunjce_provider.jar
    sunpkcs11.jar
    。确保您的策略文件中存在上述部分

    代码可能取决于您的webapp中的一些JAR,例如在
    ${catalina.base}/path/to/your/webapp/WEB-INF/classes/
    中,在这种情况下,您需要授予该目录的权限


    引起相同或类似症状的其他问题
  • 应用程序无法找到或访问
    sunpkcs11.jar
    将给出相同的错误消息(在Ubuntu+openjdk6+tomcat6系统上验证)。这个罐子的副本很可能也会被复制

  • 检查
    /etc/java-6-openjdk/security/java.security
    。它应该在那里列出提供者-检查那里有一行类似于
    security.provider.n=sun.security.pkcs11.SunPKCS11
    的内容-如果该行缺失,您也会收到此错误(在同一系统上验证)

  • 本文讨论在
    SecurityManager


  • 调试注释 根据另一个答案,您可以尝试在CATALINA.sh中添加
    -Djava.security.debug=access、failure
    CATALINA\u OPTS
    JAVA\u OPTS
    ,以启用调试,默认情况下,调试应该登录到
    CATALINA.out
    (或者您通过CATALINA.sh中的
    CATALINA_OUT
    将日志记录设置到的任何位置。您应该可以看到
    SecurityManager-Djava.security.debug=access,failure
    
    // These permissions apply to all shared system extensions
    grant codeBase "file:${java.home}/jre/lib/ext/-" {
            permission java.security.AllPermission;
    };