我已经创建了一个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服务器上启用了某种安全性,我在本地没有开启。
有谁知道这个问题是否有解决方法? 如果没有,我应该要求网上酒店的支持人员进行更改以使其成为可能吗?
答案 0 :(得分:2)
请勿尝试将BouncyCastle安装为提供程序。在您的应用程序中创建一个新的BouncyCastle
实例,并将该提供程序传递给getInstance()
重载,该重载在每个加密服务上接受Provider
参数。
对Security
类的修改会影响容器中的所有应用程序;它们不是您的应用程序的本地。使用更具针对性的方法,不需要进行全局更改。
在独立应用程序中依赖已安装的提供程序可能很方便,但是从长远来看,当您需要特定的提供程序时,它会产生很多问题,并且在JCA之上编写的库不允许您指定提供者。
答案 1 :(得分:1)
没有解决方法。有很多种可能性。向您的提供者解释您想要做什么,并与他们讨论选项。它们包括:
请注意,如果你有一个共享的Tomcat实例,那么提供商同意上述任何一个的可能性都很小。