在客户的软件中,我们必须阅读给定的 URL 来解析他们的内容。此外,客户需要激活 Tomcat-Security-Manager 以让 Java-Policies 控制程序的功能。
现在,在读取 URL 时,会发生异常“javax.net.ssl.SSLKeyException: RSA premaster secret error”,但仅在某些条件下:
- 如果 URL 是 HTTPS 但不是 HTTP
- 如果安全管理器被激活,而不是在它被停用时,或者如果在全局授权块中设置了 AllPermission
- 仅适用于 Java 6,不适用于 Java 7(客户目前需要 Java 6)
- 只带Tomcat6,不带Tomcat 7(客户目前需要Tomcat 6)
安全违规发生在 Java 代码中的某个地方,仅限于我们的代码库的 AllPermission 并不能防止错误。
那么,是否有人有想法,为 Java 6 设置哪个权限,以便它可以处理 HTTPS?
其他信息:它在一个 tomcat 中运行,在一个带有 OpenJDK 的 Debian-Linux 上。
编辑:我在变量 JAVA_OPTS 中将 Java 参数“-Djava.security.debug=access,failure”添加到 Tomcats /etc/default/tomcat6 中。但是在日志中我没有其他消息。代码是否有可能在触发权限之前询问权限?
EDIT2:我找到了正确的位置并获得了完整的堆栈跟踪(删除了特定的客户部分):
javax.net.ssl.SSLKeyException: RSA premaster secret error
at [...]
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:537)
at java.lang.Thread.run(Thread.java:701)
Caused by: java.security.NoSuchAlgorithmException: SunTlsRsaPremasterSecret KeyGenerator not available
at javax.crypto.KeyGenerator.<init>(KeyGenerator.java:141)
at javax.crypto.KeyGenerator.getInstance(KeyGenerator.java:191)
... 14 more
EDIT3:到目前为止,我假设 Java 类 URL 用于访问资源的内容。但这是不正确的。它使用 Grails-Code 中的 Groovy-URL-object 和 getText()-method:
new URL(params.url).text
错误发生在这条线上。它是 Grails 版本 2.2.4。