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