Domino代理在/jvm/lib/ext中使用第三方jar解决Java安全问题

Domino代理在/jvm/lib/ext中使用第三方jar解决Java安全问题,java,security,lotus-domino,Java,Security,Lotus Domino,我遇到了Java安全问题。我有一个代理,它使用pdfbox-1.7.1.jar来解密我知道其密码的PDF。jar被放置在服务器和客户端的/jvm/lib/ext中,我得到了堆栈跟踪的一点好处: java.lang.SecurityException at java.lang.SecurityManager.checkPermission(SecurityManager.java:582) at COM.ibm.JEmpower.applet.AppletSecurity.checkSecurit

我遇到了Java安全问题。我有一个代理,它使用pdfbox-1.7.1.jar来解密我知道其密码的PDF。jar被放置在服务器和客户端的/jvm/lib/ext中,我得到了堆栈跟踪的一点好处:

java.lang.SecurityException
at java.lang.SecurityManager.checkPermission(SecurityManager.java:582)
at COM.ibm.JEmpower.applet.AppletSecurity.checkSecurityPermission(AppletSecurity.java:1332)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1613)
at COM.ibm.JEmpower.applet.AppletSecurity.checkPermission(AppletSecurity.java:1464)
at java.lang.SecurityManager.checkSecurityAccess(SecurityManager.java:1725)
at java.security.Security.insertProviderAt(Security.java:190)
at java.security.Security.addProvider(Security.java:210)
at org.apache.pdfbox.pdmodel.encryption.SecurityHandlersManager.getInstance(SecurityHandlersManager.java:146)
at org.apache.pdfbox.pdmodel.PDDocument.openProtection(PDDocument.java:1365)
at org.apache.pdfbox.pdmodel.PDDocument.decrypt(PDDocument.java:798)
at com.magerman.hremail.prep1docc.PDFDecryptor.decrypt(Unknown Source)
at com.magerman.hremail.prep1docc.MetaAttachment.decrypt(Unknown Source)
at com.magerman.hremail.prep1docc.MetaDocContainingAttachments.removePasswordOfPDFAttachments(Unknown Source)
at com.magerman.hremail.prep1docc.EPDFPreparerFactory.generateAttachmentsTriggerDocs(Unknown Source)
at com.magerman.hremail.prep1docc.EPDFPreparerFactory.run(Unknown Source)
at com.magerman.hremail.prep1docc.BaseClass.NotesMain(Unknown Source)
at lotus.domino.AgentBase.runNotes(Unknown Source)
at lotus.domino.NotesThread.run(Unknown Source)
客户端和服务器都使用8.5.3。 代理安全级别设置为3。 把罐子放进代理本身并没有帮助。 代理的签名者是服务器上的完全管理员。 安全异常似乎指向“insertProviderAt”

这就是我所尝试的:

放置

grant {
permission java.security.AllPermission;
}
解决了我的问题,但我永远也无法通过我的鹰眼管理员

我试图将权限范围缩小到数据库,但这里的文档并没有真正告诉我如何输入notes数据库

我在这里查阅了Stephan Wissel关于Xpages Java安全性的文章:并在我的/jvm/lib/security/Java.policy文件中插入了以下内容:

grant codeBase "xspnsf://server:0/development/hre-mail/hre-mail2_0/hre-mail_(2_0)_dev.nsf/-" { 
permission java.security.AllPermission;
};
但这也不起作用,我想是因为我的代码基语法对nsf数据库无效,而仅对网页有效

我还试图将许可减少到真正需要的程度,并查看以下文档:

这意味着我必须做类似的事情

java.security.SecurityPermission "insertProvider.{name}"
但是我不知道{name}应该是什么

我还读了米克尔关于

但是我的大脑在这一页的中间被炸了。特别是,我不确定如何实际实现这个方法。你能牵着我的手,陪我走过吗

当我这么做的时候,我是否正确地假设每当我在/jvm/lib/ext中放入新的jar时,我所需要做的就是

tell http restart
让JVM重新加载?我假设Domino对Xpages、代理和HTTP任务使用单个JVM,对吗

另外,我需要重新启动服务器才能使java.policy中的任何新策略生效,这对吗


有什么想法吗

感谢理查德、西蒙、马克·迈尔斯和朱利奥对这个问题的关注

我终于开始理解Mikkel的文章(通过慢慢地阅读真的):

解决方案比我想象的要简单,我被反射示例弄糊涂了

这是一种比修改java.policy文件(顺便说一句,我没有管理)更优雅的方法

我修改了调用decrypt()方法时产生问题的类,添加了一个新方法doPrivilegedDecrypt(),它是一个巧妙的包装器,用于包装引起问题的方法。然后,我将所有调用者修改为PDFDecryptor.decrypt(),以便他们调用PDFDecryptor.doPrivilegedDecrypt()。最后一步涉及将整个类导出到一个jar文件中,然后将该文件放在您正在开发的机器(在客户端)和运行此代码的所有服务器上的\jvm\lib\ext文件夹中

我还无法确定是否存在修改java.policy文件的语法,以便它只影响单个Notes数据库。(更新:我现在知道这是不可能的)


失败的实际安全异常是什么?您的代理处于什么安全级别?在xspnsf的最后一部分中,您是否尝试将JAR移动到NSF中?您最后的假设是什么版本的Domino?web代理(即执行的webQueryOpen、webQueryOpen或?OpenAgent)在HTTP任务的JVM中运行。计划代理和触发代理在AMGR任务中的单独JVM中运行。我还没有完成xpages的工作,所以我不确定它们是否与web代理共享同一个JVM。@Richard-这对我来说是新的,谢谢。所以至少有2个,也许3个JVM在运行,并且安全设置适用于所有JVM?另外,由于tellhttprestart重新启动了JVM,这对小老我来说更让人困惑。我认为配置设置适用于所有JVM实例,但我不完全确定。对于AMGR,我认为“告诉AMGR重新启动”现在可以工作了,尽管我通常会在“告诉AMGR退出”之后加上“加载AMGR”。(旧习难改。)你试过PDFBox的支持社区吗?如果需要添加“java.security.SecurityPermission”insertProvider.{name},他们可能知道“name”是什么。grant codeBase“xspnsf:…”影响单个命名数据库。但仅适用于更高版本。simon,此设置适用于xpages,但不适用于普通notes数据库。至少这是我在测试时发现的。
package com.magerman.hremail.prep1docc;

public class PDFDecryptor {

/**
 * Instantiates a new pDF decryptor.
 * 
 * @param inputFile
 *            the input file
 * @param inputPassword
 *            the input password
 */
public PDFDecryptor(final File inputFile, final String inputPassword) {
originalFile = inputFile;
password = inputPassword;
}

/**
 * Decrypt. Given an inputted PDF File, will try to remove the security of
 * the PDF and save in-place. Done after the attachments have been extracted
 */
public final void decrypt() {
// naughty code here
}


public final void doproviledgeddecrypt() throws Exception {
AccessController.doPrivileged(new PrivilegedExceptionAction() {
    public Object run() throws Exception {
    PDFDecryptor.this.decrypt();
    return null;
    }
});
}

}