java - Domino Agent 在/jvm/lib/ext 中使用第三方 jar 来解决 Java 安全问题

标签 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.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。 将 jar 放在代理本身中无济于事。 代理的签名者是服务器上的完全管理员。 安全异常似乎指向“insertProviderAt”

这是我尝试过的:

grant {
permission java.security.AllPermission;
}

解决了我的问题,但我永远不会通过我的鹰眼管理员解决这个问题。

我正在尝试将权限范围缩小到仅数据库,但此处的文档:http://docs.oracle.com/javase/7/docs/technotes/guides/security/PolicyFiles.html并没有真正告诉我如何输入笔记数据库。

我在这里查看了 Stephan Wissel 关于 Xpages Java 安全性的文章:http://www.wissel.net/blog/d6plinks/SHWL-8JYAT5并将以下内容插入到我的/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;
};

但这也不起作用,我想是因为我的 codeBase 语法对 nsf 数据库无效,但仅对网页有效。

我也在尝试将权限减少到真正需要的权限,并查看此处的文档:http://docs.oracle.com/javase/1.4.2/docs/guide/security/permissions.html

暗示我必须做类似的事情

java.security.SecurityPermission "insertProvider.{name}"

但我不知道 {name} 应该是什么。

我还阅读了 Mikkel 关于 http://lekkimworld.com/2013/06/20/java_in_notes_domino_explained_on_java_security_and_how_it_relates_to_notes_domino.html 的文章

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

当我这样做时,我是否正确地假设每当我将新 jar 放入/jvm/lib/ext 时,我需要做的就是一个

tell http restart

重新加载 JVM?我假设 Domino 正在为 Xpages、代理和 HTTP 任务使用单个 JVM,对吗?

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

有什么想法吗?

最佳答案

感谢 Richard、Simon、Mark Myers 和 giulio 查看问题。

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

http://lekkimworld.com/2013/06/20/java_in_notes_domino_explained_on_java_security_and_how_it_relates_to_notes_domino.html

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

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

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

我也无法确定是否有修改 java.policy 文件的语法,以便它只影响单个 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;
    }
});
}

}

关于java - Domino Agent 在/jvm/lib/ext 中使用第三方 jar 来解决 Java 安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19169014/

相关文章:

java - 通过服务公开 JPA 实体

java - log4j2 文件未写入文件

javascript - Web 身份验证 - 如何安全地将用户名/密码从客户端传输到服务器

java - 在 IBM Domino 中创建重定向的 HTTP 请求的方法

javascript - 使用 LotusScript 代理创建按钮

java - 如何从 Lotus Notes 启动应用程序,然后保存到 Lotus 数据库?

java - Eclipse Spring Boot 构建路径包含重复条目

java - spring data批量保存时如何判断违规实体

java - JMS中不可信数据反序列化安全问题

java - 如何使用 java 安全地验证服务器套接字?