署名された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が署名されている場合でもポリシーファイルは使用されますか?
- 他のアイデアはありますか?:)