为什么我得到AccessControlException:当我在Tomcat servlet中将BouncyCastleProvider添加到Security时拒绝访问

时间:2014-03-17 15:32:34

标签: java security tomcat servlets bouncycastle

我已经创建了一个Java servlet并在Web酒店的Tomcat服务器上运行它。它应该向iOS设备发送推送消息,所以我添加了JavaPNS。这在我的本地Tomcat服务器上工作正常,但是当我在Web酒店提供的Tomcat服务器上部署它时,这句话:

Security.addProvider(new BouncyCastleProvider());

给出了例外:

Exception in thread "Thread-193" java.lang.InternalError: cannot create instance of org.bouncycastle.jce.provider.symmetric.AES$Mappings : java.security.AccessControlException: access denied (java.security.SecurityPermission putProviderProperty.BC) 
at org.bouncycastle.jce.provider.BouncyCastleProvider.loadAlgorithms(Unknown Source) 
at org.bouncycastle.jce.provider.BouncyCastleProvider.setup(Unknown Source) 
at org.bouncycastle.jce.provider.BouncyCastleProvider.access$000(Unknown Source) 
at org.bouncycastle.jce.provider.BouncyCastleProvider$1.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at org.bouncycastle.jce.provider.BouncyCastleProvider.(Unknown Source) 
at javapns.communication.ConnectionToAppleServer.(ConnectionToAppleServer.java:41) 
....

可能是网络酒店在Tomcat服务器上启用了某种安全性,我在本地没有开启。

有谁知道这个问题是否有解决方法? 如果没有,我应该要求网上酒店的支持人员进行更改以使其成为可能吗?

2 个答案:

答案 0 :(得分:2)

请勿尝试将BouncyCastle安装为提供程序。在您的应用程序中创建一个新的BouncyCastle实例,并将该提供程序传递给getInstance()重载,该重载在每个加密服务上接受Provider参数。

Security类的修改会影响容器中的所有应用程序;它们不是您的应用程序的本地。使用更具针对性的方法,不需要进行全局更改。

在独立应用程序中依赖已安装的提供程序可能很方便,但是从长远来看,当您需要特定的提供程序时,它会产生很多问题,并且在JCA之上编写的库不允许您指定提供者。

答案 1 :(得分:1)

没有解决方法。有很多种可能性。向您的提供者解释您想要做什么,并与他们讨论选项。它们包括:

  • 安装BouncyCastle提供程序的提供程序
  • 提供商授予您自己添加提供商的必要权限

请注意,如果你有一个共享的Tomcat实例,那么提供商同意上述任何一个的可能性都很小。