0

Java Enterprise アプリケーションから C/C++ とやり取りする必要があります。Node/Cell 情報を収集できるクラスを作成したいと思います。これにより、C++ から、呼び出し元のファイル システム内の JAR を追跡できるようになります (権威的に)。アプリケーションに関するこの種の情報を提供する、利用できる特定の Java ライブラリはありますか? 理想的には、次のようになります: (EnvProvider と呼びましょう)

  1. Java アプリが EnvProvider を呼び出す
  2. EnvProvider は、それを呼び出した Java アプリケーションに関する情報を収集します
  3. EnvProvider は、ラップされた C++ (CORBA、SOAP でしょうか?) を呼び出し、この情報を渡します。
  4. C++ トレースは、filsystem を呼び出し元のアプリにバックアップし、アプリケーションの呼び出し元とされる実際の JAR ファイルを調べます。

些細なことのように思えますが (ここではわずか 4 つのステップで概説しています)、これまでの調査から、Java アプリケーション自体から Java アプリケーションに関する十分な情報を取得する良い方法はないようです。「十分な」情報とは、C++ に十分な情報を与えて、ファイル システムを調べ、デプロイされた EAR、JAR、WAR を見つけるのに十分な情報を意味します。

あなたが提供できる情報は、非常に高く評価されます!

よろしく

チャド

*編集*

キムさん、返信ありがとうございます。この特定のトレースを取得する必要がある理由を少し説明しましょう。

私は C/C++ で書かれた暗号化ライブラリに取り組んでいます。これらは私の前任者 (私が働いている場所) によって書かれたもので、非常によくテストされています。ただし、それらは単なる暗号化以上のものを提供し、それに含まれるアルゴリズムは独自のものであり、安全を維持する必要があります. Java は簡単に逆コンパイルされるため、Java で同じものを実装することはできません。実際、私の前任者は (当然のことながら) C/C++ ソースを難読化するために多大な努力をしました。これらのライブラリは、シェル、ネイティブ C/C++ バイナリ実行可能ファイル (.exe など)、および呼び出しが (ほとんど) 完全に含まれるアプリケーションから来る他のアプリケーションでうまく機能します。このソースは、それを呼び出すアプリケーションが実際に信頼できるアプリケーションであることを確認する方法を提供します (コード署名に似ていますが、

私はこの機能をエンタープライズ Java アーキテクチャに拡張しようとしています。そのためには、デプロイされた WAR または EAR に到達することを意味する場合でも、呼び出し元に戻ることができる必要があります。 app がパッケージ化されているので、C/C++ ソースでソース ファイルを使用できます。したがって、呼び出しがアプリケーション A からのもので、アプリケーションが App_A.EAR にデプロイされている場合、その情報を取得して C/C++ を呼び出し、その EAR までさかのぼって操作したいと思います。混乱を招くように聞こえるかもしれませんが、申し訳ありませんが、(行動の問題として) ファイル (.exe または JAR/WAR/EAR) の使用目的の大部分を省略しています。

ご協力いただきありがとうございます。

*編集*

チャド

4

1 に答える 1

1

答えにたどり着く前に、考慮していただきたい 3 つの懸念事項があります。

  1. 基礎となる jar/ear/war/class ファイルを見つける必要があるのはなぜですか? 悪意のあるコードの実行を心配していますか? その場合は、代わりにコード署名セキュリティ ポリシーを使用することを強くお勧めします。これらは、プラットフォームに組み込まれている適切なツールです。
  2. アプリケーション サーバーとエンタープライズ アプリケーションは、他のアプリケーションからすぐにアクセスできない方法で jar ファイルまたはクラス ファイルを格納できるカスタム クラス ローダーを使用する場合があります。そのような例を思い出すことはできませんが、クラスローダーがリソースを物理ファイルにマップする方法について、一貫して実行する限り、Java が特定の方法を強制したり義務付けたりすることはありません。設計上、クラスとリソースをロードするためのインターフェイスは、基盤となるオペレーティング システムの特異性から意図的に分離されています。特にエンタープライズ アプリケーションの実装では、jar ファイルの保存方法を変更するインセンティブが発生する可能性があります。
  3. クラスター化された環境の場合、おそらく運が悪いでしょう。クラスタ内の異なるノード間の通信を容易にするすべての要素は、Java Enterprise Edition 仕様によって規定または管理されているわけではありません。特定のベンダーは、リモート インターフェイスが通信しているノードを特定できる独自のインターフェイスを持っている場合がありますが、クラスタリングと負荷分散の目標は、アプリとそのクライアントに対して透過的にすることであるため、おそらく、それを行う可能性はさらに低くなります。この情報にアクセスします。

さて、答えに進みます。Class.getProtectionDomainとを調べてみてくださいProtectionDomain.getCodeSource

ProtectionDomain protectionDomain = someObject.getClass().getProtectionDomain();
SourceLocation sourceLocation = protectionDomain.getCodeSource();
URL url = sourceLocation.getLocation();

有効なセキュリティ ポリシーによっては、呼び出しによってgetProtectionDomainが発生する可能性があることに注意してください。SecurityException

アップデート:

ソフトウェアがセキュリティと信頼の問題に苦しんでいるようです。ただし、コードを実行するたびにバイナリ コードを検査する必要はありません。コード署名でも同じレベルの信頼を得ることができます。どのように?コードに署名します

  1. 外部アプリケーションがライブラリと対話する必要がある場合は、検査のためにバイナリ コードのコピーを要求してください。
  2. 結果に満足したら、独自の秘密鍵を使用してコードに署名します。
  3. 次に、自分が署名したアプリケーションの実行のみを許可するセキュリティ ポリシーを設定します。

たとえば、RSA と 2048 ビットのキー、またはさらに大きなキー サイズを使用すると、署名されたコードの一部を RSA に対する今日の既知の攻撃で置き換えることは事実上不可能です。

この戦略では、アプリケーション サーバーとそれが実行されている JVM を制御する必要があります。信頼の問題がこれを超える場合は、ソース コードを検査してバイナリに署名し、最終的には JVM 自体に署名できるオープン ソース アプリケーション サーバーを義務付けることを検討し始める必要があります。

アーキテクチャとセットアップに関する具体的な詳細を知らなくても、Java プラットフォームに組み込まれているセキュリティ機能を活用することをお勧めします。

于 2011-02-27T00:40:49.347 に答える