关于GAE上使用OpenSAMLV3的Java运行权限问题

最近一直在进行在谷歌云的标准环境(Google App Engine 简称 GAE)上的 OpenSAML 的相关开发,去年 OpenSAML 发布了V3版本,进行了大量的更新,所以我也希望使用最新的OpenSAML来进行开发。但是在 GAE 上运行会报一个错误,实际上是两个错误,一个错误轻松解决了,另外一个有点曲折,目前不完美解决。 下面简要介绍下这两个问题:

Unsafe Error

这个错误是由于OpenSAML的一个依赖导致的,这个依赖是 Metrics· Github上已经有这个issue,并且在 3.2 版本的时候解决了这个问题。就是去除Unsafe类的依赖,具体参见其Merge记录 。所以将该依赖单独提出升级版本即可,官方也建立了相应的Issue

Permission Access Deny

第二个问题同样是一个异常,这个异常具体如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Caused by: java.security.AccessControlException: access denied ("java.security.SecurityPermission" "org.apache.xml.security.register")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:445)
at org.apache.xml.security.utils.JavaUtils.checkRegisterPermission(JavaUtils.java:249)
at org.apache.xml.security.utils.ElementProxy.setDefaultPrefix(ElementProxy.java:475)
at org.apache.xml.security.utils.ElementProxy.registerDefaultPrefixes(ElementProxy.java:498)
at org.apache.xml.security.Init$2.run(Init.java:122)
at org.apache.xml.security.Init$2.run(Init.java:117)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.xml.security.Init.dynamicInit(Init.java:117)
at org.apache.xml.security.Init.init(Init.java:94)
at org.opensaml.xmlsec.signature.impl.SignatureMarshaller.<init>(SignatureMarshaller.java:55)
... 108 more

异常的主要原因就是当调用这个方法的时候org.apache.xml.security.register权限不足。通过和OpenSAMLApache Santuario项目上提Issue,最后确定问题为Google App Engine对Java的权限问题。官方给出的解决都是针对java本身的,而对GAE并没有解决。目前对于GAE关于java权限问题还在探索,因为没有任何文档描述如何在GAE上配置Java Policy文件,也不能把 xmlsec.jar 文件直接移入向相关目录,所以官方给出的解答没能实现。但是通过测试发现当使用 2.0.2 版本的 xmlsec 问题就解决了:

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.apache.santuario/xmlsec -->
<dependency>
<groupId>org.apache.santuario</groupId>
<artifactId>xmlsec</artifactId>
<version>2.0.2</version>
</dependency>

通过再次咨询官方人员发现,从2.0.3版本做出了一个变化,原文见下图,提交参见 5b197b8,也就是说这个版本起会检测静态方法来允许调用者来注册算法和其他特性的实现。看来正式这个检查无法通过GAE的权限!

Yes, the change was introduced in this patch: commit

5b197b8ce5a81414138e96870bd619f3c733631f Author: Sean Joseph Mullan
mullan@apache... Date: Thu Oct 23 13:01:15 2014 +0000 Add permission
check to static methods that allow callers to register implementations
of algorithms and other features.

目前为止还没有更好的方法,暂时使用 xmlsec 的 2.0.2 版本。 以后在好好研究一下GAE上的java权限问题。同时也感受到这些开源项目的成员还是很热心的,提出issue基本都是当天就有回复讨论。