2

署名されたjarがappletviewerで機能しない問題のトラブルシューティングを試みています。私の主な目標はブラウザの外で実行することなので、appletviewerを使用してみました。他に提案があれば教えてください。

コンテキストは次のとおりです。

  • Ubuntu 11.10
  • Java:

    $ java -version
    java version "1.6.0_26"
    Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
    Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
    

ここに問題があります:

  • 中にアプレットを含むjarmyjar.jarがあります
  • ブラウザでは正しく動作しますが、appletviewerで実行した場合は動作しません
  • 瓶は署名されています:

    $ jarsigner -verify -certs -verbose -keystore /etc/ssl/certs/java/cacerts myjar.jar
    ...
    smk     <file size> <file date> <file name>
    
          X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          [KeyUsage extension does not support code signing]
          X.509, OU=zzz, O=zzz, C=zzz (alias1)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
    ...
    jar verified.
    

また、中間署名証明書(上記のyyy)は存在しませんが、ルート証明書(zzz-またはalias1)は次のとおりです。

$ keytool -list -v -keystore /etc/ssl/certs/java/cacerts -storepass changeit|grep alias1
alias1, Mmm d, yyyy, trustedCertEntry,

これを実行する:

$ appletviewer myhtml.html

与える:

Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission preferences)

質問セット1:

  • ルート証明書が存在する場合、後続のすべての中間証明書が検証目的で受け入れ可能であると想定されていますか?上記の場合、cacertsファイルにyyyを含める必要がありますか?
  • myjar.jarのように、jarが署名されている場合、appletviewerは制限なしで実行されると想定されますか?
  • これを回避するためにそれを実行するためのより良い方法はありますか?
  • これがブラウザとappletviewerで異なる動作をするのはなぜですか?

上記がよくわからないので、cacerts2という別のローカルファイルに証明書を追加してみました。私はそれを確認することができます:

  • keytoolは、その証明書をcacertsにリストします
  • jarsignerの出力は次のようになります。

    $ jarsigner -verify -certs -verbose -keystore cacerts2 myjar.jar
    ...
    smk     <file size> <file date> <file name>
    
          X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy (alias2)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          [KeyUsage extension does not support code signing]
          X.509, OU=zzz, O=zzz, C=zzz (alias1)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
    ...
    jar verified.
    

これで、出力に中間エイリアス(yyy-またはalias2)が存在し、alias1とalias2の両方に対して検証されていることに注意してください。次のようにappletviewerを実行します。

$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit myhtml.html

それでも同じ例外が発生します。

質問セット2:

  • 上記はトラストストアに供給する正しい方法ですか?
  • 上記は、appletviewerが検証目的で-keystoreコマンドを渡されたときにjarsignerと同じように使用することを意味しますか?

私が試した3番目のことは、次のようなポリシーファイルを作成することです(これはmypolicy.policyにあります)。

keystore "cacerts2";
// Tried with this and without the next line:
//keystorePasswordURL "cacerts.pass";
// where file cacerts.pass has only "changeit" / "changeit\n" in it (tried both)

// Tried the following three:
grant signedBy "alias1" {
//grant signedBy "alias2" {
//grant {
  permission java.lang.RuntimePermission "preferences";
};

そしてこのように実行します:

$ appletviewer -J-Djava.security.policy=mypolicy.policy myhtml.html

そしてこのように:

$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit -J-Djava.security.policy=mypolicy.policy myhtml.html

結果:

  • signedBy仕様が機能せずに付与するため、ポリシーが適用されていることを確認できます
  • いずれかのsignedByによる付与が失敗している

質問セット3:

  • これは、ポリシーとsignedByを指定する正しい方法ですか?このトピックに関するOracleのドキュメントは不完全です。
  • jarが署名されている場合でもポリシーファイルは使用されますか?
  • 他のアイデアはありますか?:)
4

1 に答える 1

3

My main goal is to run it outside of the browser,..

Use Java Web Start, which could launch applets free-floating since around the 1.2 days. (Or convert the code to a frame.)

If the main point of this is testing, you might try Appleteer. AFAIR I never got around to implementing a sand-box for it (so even unsigned applet code would behave as if it were trusted).


AppletViewer used to launch applets without a security sand-box, even if they were not signed. Now it is the opposite and has a sand-box, and there is no way to get it to accept signed code as trusted!

IDEs seem to apply a policy file to the viewer, to get it to act however the user configures the IDE.

于 2012-01-13T00:47:53.710 に答える