「ほっ」と。キャンペーン
カテゴリ:Java( 3 )
Java7 Update51 にアップデートしたらJavaアプレットが動かなくなった
今まではJavaアプレットを使おうとすると、セキュリティ警告がでても実行するかどうか選べていました。
しかし、Java7 Update51 にしたら「ご使用のセキュリティ設定により、信頼出来ないアプリケーションの実行がブロックされています」と有無を言わさずに実行できなくなりました。
e0091163_4301811.jpg


どうやら、信頼された認証局が発行する署名がないと動作させない仕様にしてしまったようです。
確かにセキュリティ的観点からはそれでいいと思うんですが、サーバやネットワーク管理ツールで署名されていないJavaアプレットを使う時には非常に困ります。


対処法はJavaコントロールパネルから、動かしたいアプレットのサイトを例外登録することです。

具体的には コントロールパネル → Java → セキュリティ タブ → サイト・リストの編集 で、サイトのURLを登録すればいいようです。


参考:
Java7 Update51 署名のないJavaアプレット実行をブロック 対処方法 | saka-en
Java公式サイト:どうすれば例外サイト・リストを構成できますか。
[PR]
by jehoshaphat | 2014-01-22 04:31 | Java | Trackback | Comments(0)
(Java)Java Web Startを使ってみた
Java Web Start ってのはブラウザから JAVA プログラムを起動する仕組みのことみたいです。
Javaプログラム本体もサーバから自動ダウンロードされ、最新版のチェックとかも勝手にやってくれるようですね。
旧来のファットクライアント方式は、配備が非常に面倒でしたが、それを解決できるリッチクライアントの一つとされているようです。
(ここら辺の歴史は、@IT:リッチクライアント”に至るまでの軌跡と現在(いま)がわかりやすいです。)
Java Web Start自体は JRE の中に含まれているので、クライアントは JRE さえ入っていれば問題ないようです。
ちょうど .Net の ClickOnce に近いものですね。。


さて、今回この Java Web Start のサーバ環境の構築をやってみました。
サーバは CentOS 5.3です。(RedHat系のディストリビューションの確認は /etc/redhat-release ファイルを見ればわかります)

■Sun製Javaのインストール
(Linux)Java Web Start補足1[Sun製Javaのインストール。]を参照してください。

■WEBサーバの設定
ここからが本題です。

Java Web Start(以下JWS)は JNLP というファイルから起動をかけるようです。
このため、Webサーバ(Apache)に JNLP の MIME タイプを登録します。
>
httpd.conf に下記を追加。
AddType application/x-java-jnlp-file JNLP


■JNLPファイルの作成
これが、起動する jar ファイルやクラス、ライブラリを指定するファイルですね。
実体は XML です。
JNLPの構文は、Sun:JNLP ファイルの構文でわかります。

今回は Sun のサンプルをベースに下記のように書いて見ました。
ファイル名は hello.jnlp
<?xml version="1.0" encoding="utf-8"?>
<jnlp
spec="6.0+"
codebase="http://xxx.xxx.com/jws/"
href="hello.jnlp">

<information>
<title>Java Web Start Sample</title>
<vendor>3流PG, Inc.</vendor>
<offline-allowed/>
<shortcut online="false">
<desktop/>
<menu submenu="Java Web Start Sample Apps"/>
</shortcut>
</information>
</information>-->
<security>
<all-permissions/>
<!--<j2ee-application-client-permissions/>-->
</security>
<resources>
<j2se version="1.6+" java-vm-args="-esa -Xnoclassgc"/>
<!-- 動かすJARへのパス -->
<jar href="jws_sample.jar"/>
<jar href="lib/libname.jar"/>
</resources>
<!-- public static void mainのあるクラス -->
<application-desc main-class="test"/>
</jnlp>

重要なのは、codebase でパス指定、security、jar href= で動かしたいJARやライブラリ用JAR指定、application-desc main-class= でメインメソッドのクラス指定くらいだと思います。


■JARの作成
Java アプリケーションを JAR で出力します。
今回は Swing アプリケーションで、ただ単にラベルを張り付けただけにしました。
IDE は Eclipse を使ったので、GUIデザイナツールとして、Visual Swing for Eclipseを使いました。(詳細は【コラム】イマドキのIDE事情 (60) Swing用Eclipseプラグインの決定版! Visual Swing for Eclipse | エンタープライズ | マイコミジャーナル)
で、実行可能なJARファイルとして出力します。(最初ただの JAR で出力してると Visual Swing for Eclipse のライブラリが含まれておらず、NoClassDefFoundError,ClassNotFoundException が発生したの凡ミス注意です)
e0091163_1321621.jpg




■JARに署名がいる
上記で作成したJARですが、デジタル署名が必要なようです。
デジタル署名していないと、下記のようなエラーとなります。
e0091163_13246100.jpg


ということで、テストのため自前のオレオレ証明書を作成します。(正規に運用するんだったら、認証局から発行された証明書使わないといけませんけどね。)
まず、証明書を作らないといけないので、JDK付属の keytool を使って作成します。(keytool の使い方は、Sun:keytool - 鍵と証明書の管理ツールJava/keytool - 備忘録参照)

C:\Program Files\Java\jdk1.6.0_16\bin<keytool -genkey -alias thirdPGtest
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
姓名を入力してください。
[Unknown]: 3流PG
組織単位名を入力してください。
[Unknown]: 3流PG
組織名を入力してください。
[Unknown]: 3流PG
都市名または地域名を入力してください。
[Unknown]: xxxx
州名または地方名を入力してください。
[Unknown]: xxxx
この単位に該当する 2 文字の国番号を入力してください。
[Unknown]: jp
CN=3流PG, OU=3流PG, O=3流PG, L=xxxx, ST=xxxx, C=jp でよろしいですか?
[no]: yes
<thirdPGtest> の鍵パスワードを入力してください。
(キーストアのパスワードと同じ場合は RETURN を押してください):

そして、作成した証明書を jarsigner を使って署名をします。(jarsigner の使い方は、Sun:jarsigner - JAR 署名および検証ツールJavaKey-03 JARファイルに署名をしてみよう。参照)

C:\Program Files\Java\jdk1.6.0_16\bin<jarsigner -keypass abcdpass -storepass abcdpass k:\jws_sample.jar thirdPGtest
警告:
署名者の証明書は 6 か月以内に期限切れになります。



■HTMLの作成
クライアントに JRE 入っていれば JNLP ファイルさえブラウザから叩けば動くんですが、JRE が入ってない場合はJREダウンページに誘導させたほうがいいみたいなことが Sun の開発者ページにあったんで、そのサンプルそのままんで、JNLP呼び出し用HTMLを作ります。
HTMLの内容は(Java)Java Web Start補足2[JNLP呼び出し用、JRE無に呼び出されるhtml]1を参照してください。

上記HTMLからJRE未インストール時に呼び出される download.html はこんな感じです。
HTMLの内容は(Java)Java Web Start補足2[JNLP呼び出し用、JRE無に呼び出されるhtml]2を参照してください。



■配備
これで、できた jnlp , 署名されたjar , html を WEBサーバにアップします。
後はブラウザでアクセスするだけ。
Javaのスプラッシュスクリーンが出た後、オレオレ証明書なので警告が出ます。
e0091163_1332280.jpg

"実行"を押下するとちゃんと動きました。
e0091163_133523.jpg

ただ、テストの時はブラウザのキャッシュをクリアしながらやったほうがいいですね。
特にJNLPファイルを変更してサーバにアップしたときはキャッシュクリアしないとハマります。
Javaのスプラッシュスクリーンがでて動かない時とかは、JNLP のパス関係設定を正しいか疑ったほうがいいようです。

また、ダウンロードされたJARアプリケーション自体も JRE によりキャッシュされてるっぽいので、下記コマンドでクリアできるようです。

C:\Program Files\Java\jdk1.6.0_16\bin<javaws -uninstall


■キャッシュの場所
上記でJARのキャッシュがクリアできることを書きましたが、実際にどこにキャッシュされているか調べてみました。
キャッシュ場所はJava Web Startのキャッシュファイルの行方 - cactusman日誌によると、コントロールパネル→Java→基本タブ→インターネット一時ファイルの設定から見れるようです。
e0091163_1342370.jpg

同じく、インターネット一時ファイルの表示ボタンからはキャッシュされているアプリの一覧を見ることができ、ここからGUI操作で実行したり削除したりできるようです。
e0091163_1344913.jpg

ただ、インターネット一時ファイルの設定からキャッシュフォルダの"変更"ボタンが押下できないんですよね。
Sun:システムおよびユーザレベルのプロパティによると、deployment.properties ファイルからキャッシュフォルダを定義できるようです。
(ユーザーレベルの deployment.properties ファイルは Vista 以降だと C:\Users\ユーザ名\AppData\LocalLow\Sun\Java\Deployment にあります)
試しに deployment.properties ファイルに下記設定を追加してみました。

deployment.user.cachedir=C\:\\c

すると、コンパネからJavaのGUI設定ツールから開いたときもインターネット一時ファイルの設定がちゃんと C:\c になっていました。


参考:
Sun:Java Web Start 1.5.0 開発者ガイド
デベロッパーズコーナー:Javaプログラミングを極める 第3回:Java Web Start
Java Web Start にさわる
[PR]
by jehoshaphat | 2010-01-09 22:01 | Java | Trackback | Comments(2)
(Java)Java Web Start補足2[JNLP呼び出し用、JRE無に呼び出されるhtml]


(Java)Java Web Startを使ってみたの補足資料です。

■JNLP呼び出し用HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 
<html>
<head>
<title>Java Web Start Sample</title>
</head>
 
<body>
 
<SCRIPT LANGUAGE="JavaScript">
var javawsInstalled = 0;
var javaws142Installed=0;
var javaws150Installed=0;
var javaws160Installed = 0;
isIE = "false";
if (navigator.mimeTypes && navigator.mimeTypes.length) {
x = navigator.mimeTypes['application/x-java-jnlp-file'];
if (x) {
javawsInstalled = 1;
javaws142Installed=1;
javaws150Installed=1;
javaws160Installed = 1;
}
}
else {
isIE = "true";
}
</SCRIPT>
 
<SCRIPT LANGUAGE="VBScript">
on error resume next
If isIE = "true" Then
If Not(IsObject(CreateObject("JavaWebStart.isInstalled"))) Then
javawsInstalled = 0
Else
javawsInstalled = 1
End If
If Not(IsObject(CreateObject("JavaWebStart.isInstalled.1.4.2.0"))) Then
javaws142Installed = 0
Else
javaws142Installed = 1
End If
If Not(IsObject(CreateObject("JavaWebStart.isInstalled.1.5.0.0"))) Then
javaws150Installed = 0
Else
javaws150Installed = 1
End If
If Not(IsObject(CreateObject("JavaWebStart.isInstalled.1.6.0.0"))) Then
javaws160Installed = 0
Else
javaws160Installed = 1
End If
End If
</SCRIPT>
 
 
<script language="JavaScript">
if (javaws160Installed || (navigator.userAgent.indexOf("Gecko") !=-1)) {
document.write("<a href=http://xxx.xxx.com/jws/hello.jnlp>Launch the application(Java Web Start テスト)</a>");
} else {
document.write("Click ");
document.write("<a href=http://java.sun.com/PluginBrowserCheck?pass=http://xxx.xxx.com/jws/download.html&fail=http://java.sun.com/javase/downloads/ea.jsp>here</a> ");
document.write("to download and install JRE 6.0 and the application.");
}
</SCRIPT>
 
</body>
</html>




■JRE未インストール時に呼び出される download.html

<HTML>
<BODY>
<OBJECT codebase="http://java.sun.com/update/1.6.0/jinstall-6-windows-i586.cab#Version=6,0,0,0"
classid="clsid:5852F5ED-8BF4-11D4-A245-0080C6F74284" height=0 width=0>

<PARAM name="app" value="http://xxx.xxx.com/jws/hello.jnlp">
<PARAM name="back" value="true">
<!-- Alternate HTML for browsers which cannot instantiate the object -->
<A href="http://java.sun.com/javase/downloads/ea.jsp">
Download Java Web Start</A>
</OBJECT>
</BODY>
</HTML>

[PR]
by jehoshaphat | 2010-01-09 21:05 | Java | Trackback | Comments(0)