JBoss (4.2.2.GA) サーバーと J2SE クライアントの間に JMS 接続をセットアップしました。クライアントは Java Web Start 経由で実行され、JNLP には次のものがあります。
<jnlp version="1.5+" codebase="$$codebase" href="start.jnlp">
<!-- Information -->
<security>
<all-permissions />
</security>
<resources>
<!-- Some other non-JMS resources -->
<jar href="concurrent.jar" />
<jar href="jboss-common.jar" />
<jar href="jboss-j2ee.jar" />
<jar href="jbossmq.jar" />
<jar href="jnpserver.jar" />
<jar href="log4j.jar" />
<resources>
</jnlp>
JMS 接続は正常に機能しています。JMS トピックの構成、サブスクライブ、およびテストに成功しました。そのコードは次のとおりです。
final String topic = ... ;
final InitialContext context = new InitialContext();
PrivilegedAction<JmsConnectionContext> action = new PrivilegedAction<JmsConnectionContext>() {
@Override
public JmsConnectionContext run() {
try {
TopicConnectionFactory connectionFactory = (TopicConnectionFactory) context.lookup("TopicConnectionFactory");
TopicConnection topicConnection = connectionFactory.createTopicConnection();
int sessionId = Client.getSession().getSessionId();
topicConnection.setClientID("UMClient-" + sessionId);
TopicSession session = topicConnection.createTopicSession(false,
TopicSession.AUTO_ACKNOWLEDGE);
Topic jmsTopic = (Topic) context.lookup(topic);
TopicSubscriber subscriber = session.createDurableSubscriber(jmsTopic, topic + "-" +
sessionId);
subscriber.setMessageListener(new JmsTopicMessageListener());
topicConnection.start();
return new JmsConnectionContext(topic, topicConnection, session);
} catch(Exception e) {
logger.log(Level.SEVERE, "Topic creation and connection failed.", e);
return null;
}
}
};
return AccessController.doPrivileged(action);
また、私の JNDI プロパティの構成は非常に簡単です。
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming
java.naming.provider.url=10.1.3.143:1099
また、jar はすべて、CA 経由で発行された当社の証明書を使用して署名されています (今後数か月以内に期限切れになるように設定されていますが、まだ有効です)。javaws
古いコードの問題ではないことを確認するために、キャッシュをクリアすることも試みました。
では、なぜ警告がまだ出ているのでしょうか。私が理解している限り、コードにall-permissions
JNLP ファイルからのポリシーを付与するだけの特権アクションとして実行していますがsun.rmi.transport.tcp.TCPChannel.checkConnectPermission()
、JNDI ルックアップ中に呼び出されると、JWS セキュリティ マネージャーがセキュリティ警告を表示します。JNDI ルックアップの接続権限を昇格させるために他に設定しなければならないことはありますか? Java Web Start でそれを設定できますか?
アップデート
私はまだこの問題に取り組んでいます。サーバーの RMI ポートにアクセスしようとしたときに表示されるダイアログを絞り込みました (パーミッションをチェックしていますhost:1098
)。java.rmi.server.hostname
プロパティをに設定して、このバグ レポートhost
に記載されている回避策を試してみました。最初の RMI ルックアップは、クライアントが既に開始された後まで行われないため、.<property>
セキュリティ警告で「キャンセル」をクリックしたときのスタック トレースを次に示します。
java.security.AccessControlException: access denied (java.net.SocketPermission 10.1.3.143:1098 connect,resolve)
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkConnect(Unknown Source)
at com.sun.javaws.security.JavaWebStartSecurity.checkConnect(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.checkConnectPermission(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.invoke(Unknown Source)
at org.jnp.server.NamingServer_Stub.lookup(Unknown Source)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:667)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.jboss.naming.LinkRefPairObjectFactory.getObjectInstance(LinkRefPairObjectFactory.java:85)
at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
at org.jnp.interfaces.NamingContext.getObjectInstance(NamingContext.java:1273)
at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1290)
at org.jnp.interfaces.NamingContext.getObjectInstanceWrapFailure(NamingContext.java:1298)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:763)
at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:627)
at javax.naming.InitialContext.lookup(Unknown Source)
at com.ultramain.uui.jms.JmsHelper.jndiLookup(JmsHelper.java:145)
...
したがって、問題は RMI アクセスに固有のものです。リンクされたバグ レポートと私が見つけた他のいくつかのリソースの回避策で提案されているように、ホスト名を設定してもダイアログが修正されないのはなぜですか? これを修正する他の回避策はありますか?