Javaアプレットの眲名ずJavaセキュリティのいく぀かの埮劙な点

問題文


WYSIWYG XML゚ディタヌずしお、アプリケヌションはJavaアプレットOxygen Author Componentを䜿甚したす 。 このアプレットをクラむアントにロヌドするずき、Javaは安党でないコヌドに関する恐ろしい譊告を投げ出しおはいけたせんが、ナヌザヌに負担をかけず、重い責任を負わずに静かに静かにアプレットをロヌドしたす。 結局のずころ、しっかりしたアプリケヌションがありたす。





プロロヌグ


この蚘事は科孊的に怜蚌され、正確であるふりをするものではありたせん;定矩の䞍正確さを認めたす。 私はりィキペディアを開かなかった、私は曞いおいる、いわば、心からですが、コメントは受け入れられたす。



アプレットが指でどのように機胜するか


HTMLペヌゞでタグが怜出されるず、ブラりザはアプレットのロヌドの制埡を察応するJavaプラグむンに転送し、JavaプラグむンはクラむアントマシンにむンストヌルされたJREに制埡を転送したす。 アプレットをダりンロヌドするには2぀の方法がありたすアプレットずは、特定のJavaアプリケヌションを意味したす。これは、jar-okのセットであり、アプレットクラスを実装するMainクラスを持぀メむンjarがありたす。





この䟋では、jnlpを䜿甚したす。 jnlpアプロヌチの利点は、ずりわけ、アプレットたずえばコヌドベヌスをロヌドするためのパラメヌタを倉曎するずきに、アプレットのロヌドを担圓するHTMLたたはJavaScriptコヌドを倉曎する必芁がないこずです。 jnlpを倉曎するだけです。 絶察URLを指定する必芁があるため、コヌドベヌスコヌドベヌスはjarアプレットの堎所を瀺すURLアドレスですを眮き換えるこずは、アプレットが実行されおいるサヌバヌに応じおコヌドベヌスである必芁があるこずを意味するため、かなり䞍快な問題です。 ロヌカルマシンでは、これは1぀のアドレスであり、QAでは別のアドレスであり、本番では3番目のアドレスです。そのため、アプリケヌションを構築するずきは、コンテキストパス、぀たり動䜜するWebアプリケヌションの絶察アドレスを明瀺的に指定する必芁がありたす

jnlpファむルを䜿甚するず、クラむアントがjnlpファむルをロヌドするずきに動的にコヌドベヌスを動的に倉曎する特別なサヌブレットが存圚するずいう事実により、この問題を解決できたす。



行こう


そのため、アプレットの読み蟌みは、必芁なjarファむルずそのコヌドベヌスのリストに加えお、クラむアントマシンでこのjavaを起動するjava匕数これは非垞に重芁なポむントです。以䞋で理由を確認したすも含むjnlpファむルの読み蟌みから始たりたす。 Javaはjarのロヌドを開始し、セキュリティをチェックしたす。 これは、クラスがロヌドされる前にダりンロヌド可胜なフラむをチェックし始めるJavaセキュリティメカニズムの出番です。 このメカニズムはかなり耇雑で倚面的です。アプレットずJavaセキュリティポリシヌをクラむアントに読み蟌む際の䞀般的なセキュリティレベルの蚭定蚱可付䞎、jar自䜓のマニフェストのセキュリティパラメヌタ、怜蚌、jarのデゞタル眲名の怜蚌など。 深く掘り䞋げたくはないので、説明した問題で重芁な偎面のみに觊れたす。



参考アプレットに眲名するこずは、jarファむルに眲名するこずを意味したす。 jarに眲名するず、javaコマンドsignjarが実行され、その結果、暗号化された圢匏で眲名されたキヌに関する情報がjarに衚瀺されたす。たた、各リ゜ヌスパックjarには、このコンテンツに関する情報を含むこのキヌで暗号化されたコヌドが割り圓おられたすリ゜ヌス。 したがっお、眲名されたフラむを倉曎しようずするずたずえば、そこにクラスをスロヌしたり、叀いクラスを倉曎したりするず、そのようなフラむは無効になり、セキュリティチェックに合栌せず、ロヌドされたせん。





そのため、アプレットは眲名、自己眲名、たたは信頌できる蚌明曞によっお眲名されない堎合がありたす。 アプレットがロヌドされるクラむアントJavaのバヌゞョンに応じお、アプレットのサブスクリプションレベルは、アプレットがロヌドたたはブロックされるかどうかに圱響したすが、「このアプレットを実行するこずに同意するず、グロヌバルな倧倉動が発生し、䞀般的にすべおが消えたす」などの譊告ずメッセヌゞが倚数衚瀺されたす自己責任で実行しおください ''



画像



たたは、適切なチェックマヌクをクリックしおも、今埌繰り返すこずのできない矎しく嚁圧的なメッセヌゞを1぀ダりンロヌドしたす。 ここで、実際にタスクに到達したした。 䞊蚘の問題を解決する時点で、酞玠アプレットは自己眲名されたした。 ぀たり、眲名は停物でしたが、停物です-キヌはkeytoolナヌティリティの助けを借りお生成されたした。

圓然のこずながら、そのようなアプレットをロヌドするずき、javaは糞をファンに投げ぀けお呪いをかけたしたが、長い目で芋ればアプレットをロヌドしたした。 しかし、これらのメッセヌゞを取り陀く必芁があったため、信頌できる蚌明機関Trusted Certifictae Authorityからの蚌明曞が必芁でした。



そのため、信頌できるセンタヌからの蚌明曞が必芁です。 入手方法 簡単だが楜しいこずは安くない。 1幎間の蚌明曞の費甚は玄500アメリカ人です。 センタヌwww.verisign.comのサヌビスを䜿甚したした。 ゚むリアスずパブリッシャヌに関するその他の情報を䜿甚しおkeytoolナヌティリティを䜿甚しおキヌストアを䜜成し、特別なリク゚ストを䜜成する必芁がありたすそしおもちろん支払いたす。 応答ずしお、CAはキヌを送信したす。 私たちが送信したのは、コヌド眲名蚌明曞、䞭間CA蚌明曞、pkcs7圢匏の蚌明曞の3぀です。 JKS蚌明曞タむプの堎合、䞭間蚌明曞ずコヌド眲名蚌明曞が必芁です。 最初に、以前に䜜成されたキヌストアに䞭間蚌明曞が远加され、次にメむンのコヌド眲名蚌明曞が远加されたす。 結果のキヌストアは、jarの眲名に䜿甚されたす。



あなたのフラむが以前に眲名されおいた堎合そしお、私の堎合、眲名された、たたは自己眲名されたもの、再床眲名する前に、最初に叀い眲名を削陀する必芁がありたす。 そうしないず、アプレットをダりンロヌドするずきに、Javaが最初のフラむを止めお地獄に送られたす。 たずえば、META-INFフォルダヌから.RSAたたは.DSAおよび.SFファむルを手動で削陀したり、マニフェストファむルからすべおのダむゞェストリ゜ヌス眲名を削陀したりしお、眲名を削陀できたす。

私はほずんど忘れおいたした。jarに眲名する前に、セキュリティ属性をマニフェストに远加する必芁がありたす。



Permissions: all-permissions Codebase: * Caller-Allowable-Codebase: * Application-Library-Allowable-Codebase: *
      
      







曎新51以降、セキュリティ属性を含たないすべおのjarは自動的にブロックされたす。

そしお、これはこのためのantスクリプトです



  <target name="addSecurityProperty"> <jar file="${jarFile}" update="true"> <manifest> <attribute name="Permissions" value="all-permissions"/> <attribute name="Codebase" value="*"/> <attribute name="Application-Library-Allowable-Codebase" value="*"/> <attribute name="Caller-Allowable-Codebase" value="*"/> </manifest> </jar> </target> <target name="addSecurityProperties" if="hasForEach"> <foreach target="addSecurityProperty" param="jarFile"> <path> <fileset dir="lib" includes="**/*.jar, **/*.zip"/> </path> </foreach> </target>
      
      







重芁このスクリプトでforeachを䜿甚するには、antcontribが必芁です。



したがっお、フラむをきれいにし、必芁な属性をマニフェストに远加し、眲名し、起動したす...再び譊告が衚瀺されたす



画像



たた 皚魚だけでなく、jnlpファむルにも眲名する必芁があるこずがわかりたした。 眲名する方法は など 。 読みにくいjnlpファむルはJNLP-INFディレクトリのメむンjarにスロヌされ、ファむル名はAPPLICATION.JNLPのようになりたす。 質問ではありたせん。メむンjarを䜜成しおjarに眲名するantスクリプトに远加したす。゜ヌスjnlpを眲名付きjnlpにコピヌする簡単なコヌドです。



  <target name="compile"> <mkdir dir="classes"/> <javac srcdir="src" destdir="classes" includeantruntime="false" debug="on"> <classpath> <fileset dir="lib"> <include name="*.jar"/> </fileset> </classpath> </javac> <mkdir dir="classes/JNLP-INF"/> <copy file="author-component-dita.jnlp" tofile="classes/JNLP-INF/APPLICATION.JNLP" overwrite="true"/> </target>
      
      





父芪はすぐにそれを理解したすが、䞇が䞀に備えお、この反タヌゲットで䜕が起こるかを説明したす。 最初の郚分では、すべおが明確です-クラスディレクトリを䜜成し、そこでアプレットコヌドをコンパむルしたす。 コンパむル䞭に、libフォルダヌがクラスパスに远加されたす。これには、jar-okの束があり、アプレットが必芁であり、それらすべおに眲名する必芁がありたす。 次に、JNLP-INFフォルダヌがそこに䜜成され、元のフォルダヌがそこにコピヌされたす。

author-component-dita.jnlp。

次に、すべおをjarこれがメむンjarにパックし、残りのjarの隣の同じlibフォルダヌにドロップしたす。

珟圚、2぀のjnlpファむルがありたす。元のauthor-component-dita.jnlpずAPPLICATION.JNLPはjarにパッケヌゞ化されおいたす。 ちょっず気になりたす アプレットを起動したす-゚ラヌ



画像



今回は䜕 これらのjnlpファむルは䞀臎したせんが、䞀臎するこずがわかりたす。 元のjnlpはアプレットのダりンロヌドに䜿甚され、パッケヌゞ化されたものは眲名の怜蚌に䜿甚され、それらは異なっおはなりたせん。 しかし、なぜ圌らは異なるのですか、圌らはコピヌですか そしおここで、Webアプリケヌションのデプロむメントを容易にするために䜿甚される玠晎らしいサヌブレット JnlpDownloadServlet を思い出したす。これに぀いおは、前述したした。 これを䜿甚するず、jnlpに特定のコヌドベヌスたずえば、localhost8888 / oxygen-editor /を曞くこずはできたせんが、 $$CODEBASE



倉数を䜿甚するず、ランタむム自䜓のサヌブレットは必芁な倉数倀をjnlpに代入しお倉曎したす。 これが、ダりンロヌド可胜なjnlpが眲名されたものず䞀臎しない理由です。 どうする サヌバヌアドレスごずに異なる醞造物を展開したすか これは私たちのやり方ではありたせん。 簡単ですAPPLICATION.JNLPの代わりにAPPLICATION-TEMPLATE.JNLPを䜿甚する必芁がありたす。 APPLICATION-TEMPLATE.JNLPテンプレヌトの䜿甚は、特定のパラメヌタヌ倀の代わりに「*」を指定した堎合、たずえばcodebase = "*"の堎合、元のjnlpず異なる可胜性があるずいう点で異なりたす。 Antov build.xmlを倉曎したしょう



 <target name="compile"> <mkdir dir="classes"/> <javac srcdir="src" destdir="classes" includeantruntime="false" debug="on"> <classpath> <fileset dir="lib"> <include name="*.jar"/> </fileset> </classpath> </javac> <mkdir dir="classes/JNLP-INF"/> <copy file="author-component-dita.jnlp" tofile="classes/JNLP-INF/APPLICATION-TEMPLATE.JNLP" overwrite="true"/> <replace file="classes/JNLP-INF/APPLICATION-TEMPLATE.JNLP" token="@@CODEBASE@@" value="*"/> <replace file="classes/JNLP-INF/APPLICATION-TEMPLATE.JNLP" token="@@HREF@@" value="*"/> </target>
      
      







だから、本圓にすべおであり、アプレットをロヌドするずきに、アプレットが信頌され、信頌でき、疑わないずいう青いシヌルド付きの埅望のナヌザヌフレンドリヌなメッセヌゞが最終的に衚瀺されたすか 私の幞せを信じずに、震える手で、アプリケヌションを起動し、アプレットをダりンロヌドしお...



画像



やった 起こった 私は぀いに青い盟でこのメッセヌゞを芋たした そしお、喜びのよだれを吹きかけ、「垞にこの発行元を信頌する」チェックボックスをクリックしお閉じ、アプレットがロヌドを開始し、...が衚瀺されたす。



画像



なんお... すぐに癜髪になり、私は必死にコヌドにそれを貌り付け始めたす-そんなに非セキュリティなのは䜕ですか 䞀般に、jnlpファむルで次の行を芋぀けるためにさらに2日間殺したした。



 <j2se java-vm-args="-Xmx512m -XX:MaxPermSize=80m -Xss4m -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5021" version="1.6+" />
      
      







これらは、アプレットの起動に䜿甚されるjava匕数です。 したがっお、 デバッグ匕数はnon-securityです。 アプレットが眲名され、信頌できる蚌明曞を䜿甚しおいる堎合、これらの匕数は犁止されおいたす。 興味深いこずに、アプレットが自己眲名されおいる堎合、実行可胜なアプリケヌションが䞍明であるずクラむアントに譊告されるため、最初は危険であるため、ダッシュを少しでも実行しおアプレットを実行したす。



犁止されおいる匕数の完党なリストは次のずおりです。



 // note: this list MUST correspond to native secure.c file private static String[] secureVmArgs = { "-d32", /* use 32-bit data model if available */ "-client", /* to select the "client" VM */ "-server", /* to select the "server" VM */ "-verbose", /* enable verbose output */ "-version", /* print product version and exit */ "-showversion", /* print product version and continue */ "-help", /* print this help message */ "-X", /* print help on non-standard options */ "-ea", /* enable assertions */ "-enableassertions", /* enable assertions */ "-da", /* disable assertions */ "-disableassertions", /* disable assertions */ "-esa", /* enable system assertions */ "-enablesystemassertions", /* enable system assertions */ "-dsa", /* disable system assertione */ "-disablesystemassertions", /* disable system assertione */ "-Xmixed", /* mixed mode execution (default) */ "-Xint", /* interpreted mode execution only */ "-Xnoclassgc", /* disable class garbage collection */ "-Xincgc", /* enable incremental gc. */ "-Xbatch", /* disable background compilation */ "-Xprof", /* output cpu profiling data */ "-Xdebug", /* enable remote debugging */ "-Xfuture", /* enable strictest checks */ "-Xrs", /* reduce use of OS signals */ "-XX:+ForceTimeHighResolution", /* use high resolution timer */ "-XX:-ForceTimeHighResolution", /* use low resolution (default) */ "-XX:+PrintGCDetails", /* Gives some details about the GCs */ "-XX:+PrintGCTimeStamps", /* Prints GCs times happen to the start of the application */ "-XX:+PrintHeapAtGC", /* Prints detailed GC info including heap occupancy */ "-XX:PrintCMSStatistics", /* If > 0, Print statistics about the concurrent collections */ "-XX:+PrintTenuringDistribution", /* Gives the aging distribution of the allocated objects */ "-XX:+TraceClassUnloading", /* Display classes as they are unloaded */ "-XX:SurvivorRatio", /* Sets the ratio of the survivor spaces */ "-XX:MaxTenuringThreshol", /* Determines how much the objects may age */ "-XX:CMSMarkStackSize", "-XX:CMSMarkStackSizeMax", "-XX:+CMSClassUnloadingEnabled",/* It needs to be combined with -XX:+CMSPermGenSweepingEnabled */ "-XX:+CMSIncrementalMode", /* Enables the incremental mode */ "-XX:CMSIncrementalDutyCycleMin", /* The percentage which is the lower bound on the duty cycle */ "-XX:+CMSIncrementalPacing", /* Automatic adjustment of the incremental mode duty cycle */ "-XX:CMSInitiatingOccupancyFraction", /* Sets the threshold percentage of the used heap */ "-XX:+UseConcMarkSweepGC", /* Turns on concurrent garbage collection */ "-XX:-ParallelRefProcEnabled", "-XX:ParallelGCThreads", /* Sets the number of parallel GC threads */ "-XX:ParallelCMSThreads", "-XX:+DisableExplicitGC", /* Disable calls to System.gc() */ "-XX:+UseCompressedOops", /* Enables compressed references in 64-bit JVMs */ "-XX:+UseG1GC", "-XX:GCPauseIntervalMillis", "-XX:MaxGCPauseMillis" /* A hint to the virtual machine to pause times */ };
      
      







ご枅聎ありがずうございたした。この蚘事がお圹に立おば幞いです。




All Articles