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

我遇到了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放入代理本身并没有帮助。 代理的签名者是服务器上的完全管理员。 安全exception似乎指向“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数据库无效,但仅对网页有效。

我也试图将Permission减少到真正需要的那个,并查看这里的文档: http : //docs.oracle.com/javase/1.4.2/docs/guide/security/permissions.html

暗示我必须做类似的事情

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

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

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

但是我的大脑在页面中间左右炸了。 特别是,我不确定如何实际实现此方法。 你能抓住我的手,让我走过吗?

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

 tell http restart 

让JVM重新加载? 我假设Domino使用单个JVM进行Xpages,代理和HTTP任务,这是正确的。

另外,我是否正确,我需要重新启动服务器以使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

解决方案比我想象的要容易,我对reflection示例感到困惑。

这比修改java.policy文件(我没有管理,btw)更优雅。

当我通过添加一个新方法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; } }); } }