1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
|
<html>
<head>
<title>
Handbuch der Java-Programmierung, 5. Auflage
</title>
</head>
<body>
<a name="startofbody"></a>
<script language="JavaScript" src="hjp4lib.js">
</script>
<script language="JavaScript">
installKbdHandler("97,#startofbody;101,#endofbody;116,cover.html;122,k100003.html;115,search.html;105,index.html;100,JDKDOCS;112,APIDOCS;104,k100302.html;106,k100304.html;107,k100306.html;108,k100307.html");
</script>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100302.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100304.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100306.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100307.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">Kapitel 48 - Sicherheit und Kryptographie
</table>
<hr>
<!-- Section -->
<a name="sectlevel2id048003"></a>
<h2>48.3 Signierte Applets </h2>
<hr>
<ul>
<li><a href="k100305.html#sectlevel2id048003">48.3 Signierte Applets</a>
<ul>
<li><a href="k100305.html#sectlevel3id048003001">48.3.1 Ein »unerlaubtes« Applet</a>
<li><a href="k100305.html#appletssignieren">48.3.2 Signieren des Applets</a>
<li><a href="k100305.html#sectlevel3id048003003">48.3.3 Ex- und Import von Zertifikaten</a>
<li><a href="k100305.html#policydateien">48.3.4 Anpassen der Policy-Datei</a>
<ul>
<li><a href="k100305.html#sectlevel4id048003004001">Policy-Dateien</a>
<li><a href="k100305.html#sectlevel4id048003004002">Das Format einer Policy-Datei</a>
<li><a href="k100305.html#sectlevel4id048003004003">Erstellen der Policy-Datei</a>
</ul>
<li><a href="k100305.html#sectlevel3id048003005">48.3.5 Die Klasse SecurityManager</a>
</ul>
</ul>
<hr>
<p>
In diesem Abschnitt wird beschrieben, wie einem Applet der Zugriff
auf geschützte Ressourcen gewährt werden kann. Wir gehen
dazu in folgenden Schritten vor:
<ol type=1>
<li>Zunächst wird ein Applet entwickelt, das auf einige beschränkte
Ressourcen zugreift. Ohne weitere Vorkehrungen ist es nicht lauffähig,
sondern wird mit einer <a name="ixa103509"><a href="index_s.html#ixb102633"><font color=#000080><tt>SecurityException</tt></font></a></a>
abgebrochen.
<li>Anschließend zeigen wir, wie das Applet mit Hilfe des in
<a href="k100303.html#digitaleunterschriften">Abschnitt 48.1.6</a>
erzeugten Schlüsselpaars signiert wird.
<li>Danach demonstrieren wir die Weitergabe von Zertifikaten.
<li>Schließlich zeigen wir, wie die Sicherheitseinstellungen
so angepasst werden, dass das Applet Zugriff auf die gewünschten
Ressourcen erhält.
</ol>
<!-- Section -->
<a name="sectlevel3id048003001"></a>
<h3>48.3.1 Ein »unerlaubtes« Applet </h3>
<p>
Wir wollen uns die Aufgabe stellen, ein Applet zu schreiben, das einige
Sicherheitsverstöße begeht. Zunächst soll es eine
Datei auf dem lokalen Computer erzeugen und einen Zeitstempel hineinschreiben.
Zusätzlich soll es auf einige geschützte System-Properties
zugreifen und deren Inhalt in die Datei schreiben. Das Applet hat
folgenden Aufbau:
<a name="listingid048007"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#00AA00">/* TrustedApplet.java */</font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">import</font> java.awt.*;
<font color="#555555">004 </font><font color="#0000AA">import</font> java.applet.*;
<font color="#555555">005 </font><font color="#0000AA">import</font> java.util.*;
<font color="#555555">006 </font><font color="#0000AA">import</font> java.io.*;
<font color="#555555">007 </font>
<font color="#555555">008 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> TrustedApplet
<font color="#555555">009 </font><font color="#0000AA">extends</font> Applet
<font color="#555555">010 </font>{
<font color="#555555">011 </font> <font color="#0000AA">static</font> <font color="#0000AA">final</font> String ALLOWED_DIR = <font color="#0000FF">"c:\\tmp\\applets\\"</font>;
<font color="#555555">012 </font> <font color="#0000AA">static</font> <font color="#0000AA">final</font> String FNAME = <font color="#0000FF">"TrustedApplet.log"</font>;
<font color="#555555">013 </font> <font color="#0000AA">static</font> <font color="#0000AA">final</font> String LOGMSG = <font color="#0000FF">"Erzeugt von Applet: "</font>;
<font color="#555555">014 </font> String msg;
<font color="#555555">015 </font>
<font color="#555555">016 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> init()
<font color="#555555">017 </font> {
<font color="#555555">018 </font> msg = <font color="#0000FF">"Uninitialisiert"</font>;
<font color="#555555">019 </font> FileWriter out = <font color="#006699">null</font>;
<font color="#555555">020 </font> <font color="#0000AA">try</font> {
<font color="#555555">021 </font> <font color="#00AA00">//Ausgabedatei erzeugen</font>
<font color="#555555">022 </font> out = <font color="#0000AA">new</font> FileWriter(ALLOWED_DIR + FNAME);
<font color="#555555">023 </font> <font color="#00AA00">//Logmessage schreiben</font>
<font color="#555555">024 </font> out.write(LOGMSG);
<font color="#555555">025 </font> <font color="#00AA00">//Zeitstempel schreiben</font>
<font color="#555555">026 </font> GregorianCalendar cal = <font color="#0000AA">new</font> GregorianCalendar();
<font color="#555555">027 </font> out.write(cal.get(Calendar.DATE) + <font color="#0000FF">"."</font>);
<font color="#555555">028 </font> out.write((cal.get(Calendar.MONTH) + 1) + <font color="#0000FF">"."</font>);
<font color="#555555">029 </font> out.write(cal.get(Calendar.YEAR) + <font color="#0000FF">" "</font>);
<font color="#555555">030 </font> out.write(cal.get(Calendar.HOUR_OF_DAY) + <font color="#0000FF">":"</font>);
<font color="#555555">031 </font> out.write(cal.get(Calendar.MINUTE) + <font color="#0000FF">":"</font>);
<font color="#555555">032 </font> out.write(cal.get(Calendar.SECOND) + <font color="#0000FF">""</font>);
<font color="#555555">033 </font> out.write(System.getProperty(<font color="#0000FF">"line.separator"</font>));
<font color="#555555">034 </font> <font color="#00AA00">//System-Properties lesen und in Datei schreiben</font>
<font color="#555555">035 </font> out.write(getProp(<font color="#0000FF">"user.name"</font>));
<font color="#555555">036 </font> out.write(getProp(<font color="#0000FF">"user.home"</font>));
<font color="#555555">037 </font> out.write(getProp(<font color="#0000FF">"user.dir"</font>));
<font color="#555555">038 </font> <font color="#00AA00">//Datei schließen</font>
<font color="#555555">039 </font> msg = <font color="#0000FF">"Alle Sicherheitshuerden ueberwunden!"</font>;
<font color="#555555">040 </font> } <font color="#0000AA">catch</font> (Exception e) {
<font color="#555555">041 </font> msg = e.toString();
<font color="#555555">042 </font> } <font color="#0000AA">finally</font> {
<font color="#555555">043 </font> <font color="#0000AA">if</font> (out != <font color="#006699">null</font>) {
<font color="#555555">044 </font> <font color="#0000AA">try</font> {
<font color="#555555">045 </font> out.close();
<font color="#555555">046 </font> } <font color="#0000AA">catch</font> (IOException e) {
<font color="#555555">047 </font> <font color="#00AA00">//silently ignore</font>
<font color="#555555">048 </font> }
<font color="#555555">049 </font> }
<font color="#555555">050 </font> }
<font color="#555555">051 </font> }
<font color="#555555">052 </font>
<font color="#555555">053 </font> <font color="#0000AA">public</font> <font color="#006699">void</font> paint(Graphics g)
<font color="#555555">054 </font> {
<font color="#555555">055 </font> g.drawString(msg, 20, 20);
<font color="#555555">056 </font> }
<font color="#555555">057 </font>
<font color="#555555">058 </font> <font color="#0000AA">private</font> String getProp(String prop)
<font color="#555555">059 </font> {
<font color="#555555">060 </font> <font color="#0000AA">return</font> prop + <font color="#0000FF">"="</font> +
<font color="#555555">061 </font> System.getProperty(prop) +
<font color="#555555">062 </font> System.getProperty(<font color="#0000FF">"line.separator"</font>);
<font color="#555555">063 </font> }
<font color="#555555">064 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/TrustedApplet.java"><font color="#000055" size=-1>TrustedApplet.java</font></a></td>
</tr>
</table>
<i>
Listing 48.7: Ein »unerlaubtes« Applet</i></p>
<p>
Es versucht zunächst eine Datei <font color="#660099">c:\tmp\applets\TrustedApplet.log</font>
zu erzeugen. Wenn dies gelingt, instanziert es ein aktuelles <a href="index_g.html#ixb100793"><font color=#000080><tt>GregorianCalendar</tt></font></a>-Objekt
und schreibt dessen Werte in die Datei. Schließlich versucht
es, die System-Properties »user.name«, »user.home«
und »user.dir« zu lesen und deren Werte ebenfalls in die
Datei zu schreiben. Sind all diese Versuche erfolgreich, gibt das
Applet die Meldung »Alle Sicherheitshuerden ueberwunden!«
aus. Tritt eine Ausnahme auf, wird deren Text ausgegeben.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Um das Schreiben der Datei zu ermöglichen, ist ein Verzeichnis
<font color="#660099">c:\tmp\applets</font> anzulegen. Andernfalls
gibt es eine <a href="index_i.html#ixb100709"><font color=#000080><tt>IOException</tt></font></a>
- selbst wenn alle Sicherheitshürden genommen sind.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Das Applet kann mit folgender HTML-Datei gestartet werden:
<a name="listingid048008"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA"><html></font>
<font color="#555555">002 </font><font color="#0000AA"><head></font>
<font color="#555555">003 </font><font color="#0000AA"><title></font>TrustedApplet Demo<font color="#0000AA"></title></font>
<font color="#555555">004 </font><font color="#0000AA"></head></font>
<font color="#555555">005 </font>
<font color="#555555">006 </font><font color="#0000AA"><body></font>
<font color="#555555">007 </font><font color="#0000AA"><h1></font>TrustedApplet Demo<font color="#0000AA"></h1></font>
<font color="#555555">008 </font>
<font color="#555555">009 </font><font color="#0000AA"><applet
<font color="#555555">010 </font> code=</font><font color="#0000FF">"TrustedApplet.class"</font><font color="#0000AA">
<font color="#555555">011 </font> width=600
<font color="#555555">012 </font> height=200
<font color="#555555">013 </font>></font>
<font color="#555555">014 </font>TrustedApplet Demo
<font color="#555555">015 </font><font color="#0000AA"></applet></font>
<font color="#555555">016 </font>
<font color="#555555">017 </font><font color="#0000AA"></body></font>
<font color="#555555">018 </font><font color="#0000AA"></html></font></pre>
</font>
</td>
</tr>
</table>
<i>
Listing 48.8: Vorläufige HTML-Datei zum Aufruf des unerlaubten
Applets</i></p>
<p>
Das Applet kann nun beispielsweise mit dem <a href="index_a.html#ixb100158"><font color=#000080><tt>appletviewer</tt></font></a>
gestartet werden:
<font color="#333300">
<pre>
appletviewer TrustedApplet.html
</pre>
</font>
<p>
Wird es ohne weitere Vorkehrungen gestartet, scheitert es bereits
am Erzeugen der Ausgabedatei und gibt eine <a href="index_s.html#ixb102633"><font color=#000080><tt>SecurityException</tt></font></a>
auf dem Bildschirm aus.
<!-- Section -->
<a name="appletssignieren"></a>
<h3>48.3.2 Signieren des Applets </h3>
<p>
Zum Signieren ist es zunächst erforderlich, alle für den
Betrieb des Applets nötigen Dateien in ein jar-File zu packen.
Signiert wird also nicht eine einzelne <font color="#660099">.class</font>-Datei,
sondern alle Dateien innerhalb des jar-Archivs. Dazu verwenden wir
folgendes Kommando:
<font color="#333300">
<pre>
jar cvf trapp.jar TrustedApplet.class
</pre>
</font>
<p>
Jetzt wird ein jar-Archiv <font color="#660099">trapp.jar</font> erstellt,
das die Klassendatei <font color="#660099">TrustedApplet.class</font>
enthält. Dieses Archiv muss nun signiert werden. Dazu steht im
JDK das Hilfsprogramm <a name="ixa103510"><a href="index_j.html#ixb102634"><font color=#000080><tt>jarsigner</tt></font></a></a>
zur Verfügung. Es arbeitet kommandozeilenbasiert und wird folgendermaßen
aufgerufen:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
jarsigner -signedjar <i>outjar</i> <i>injar</i> <i>alias</i>
</pre>
</font>
</td>
</tr>
</table>
<p>
Die einzelnen Elemente haben folgende Bedeutung:
<ul>
<li><i>injar</i> ist der Name des zu signierenden jar-Archivs.
<li><i>outjar</i> ist der Name der Ausgabedatei, also des signierten
Archivs.
<li><i>alias</i> ist der Aliasname des Eintrags in der Schlüsseldatenbank,
dessen privater Schlüssel zum Signieren verwendet werden soll.
</ul>
<p>
Nachdem wir in <a href="k100303.html#digitaleunterschriften">Abschnitt 48.1.6</a>
bereits ein Schlüsselpaar mit dem Alias »hjp3« erzeugt
und in der Schlüsseldatenbank abgelegt haben, muss der Aufruf
von <a href="index_j.html#ixb102634"><font color=#000080><tt>jarsigner</tt></font></a>
so erfolgen:
<font color="#333300">
<pre>
C:\---><b>jarsigner -signedjar strapp.jar trapp.jar hjp3</b>
Enter Passphrase for keystore: <b>hjp3ks</b>
Enter key password for hjp3: <b>hjp3key</b>
</pre>
</font>
<p>
Die beiden Paßwörter zum Zugriff auf die Schlüsseldatenbank
und den Schlüssel werden auf Nachfrage in der Kommandozeile angegeben.
Nachdem das Programm einige Zeit gerechnet hat, erzeugt es das signierte
Archiv mit dem Namen <font color="#660099">strapp.jar</font>.
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
<a href="index_j.html#ixb102634"><font color=#000080><tt>jarsigner</tt></font></a>
bietet neben den hier erwähnten noch weitere Optionen, auf die
wir nicht weiter eingehen wollen. Das Programm wird zusammen mit den
anderen Hilfsprogrammen in der Tool-Dokumentation des JDK ausführlich
beschrieben.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<p>
Bisher wurde das Applet direkt aus der <font color="#660099">.class</font>-Datei
geladen. Um es aus einem jar-Archiv zu laden, muss das <font color="#000077"><tt>APPLET</tt></font>-Tag
der HTML-Datei um das <a name="ixa103511"><a href="index_a.html#ixb102635"><font color=#000080><tt>archive</tt></font></a></a>-Argument
erweitert werden:
<a name="listingid048009"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#0000AA"><-- TrustedApplet.html --></font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA"><html></font>
<font color="#555555">004 </font><font color="#0000AA"><head></font>
<font color="#555555">005 </font><font color="#0000AA"><title></font>TrustedApplet Demo<font color="#0000AA"></title></font>
<font color="#555555">006 </font><font color="#0000AA"></head></font>
<font color="#555555">007 </font>
<font color="#555555">008 </font><font color="#0000AA"><body></font>
<font color="#555555">009 </font><font color="#0000AA"><h1></font>TrustedApplet Demo<font color="#0000AA"></h1></font>
<font color="#555555">010 </font>
<font color="#555555">011 </font><font color="#0000AA"><applet
<font color="#555555">012 </font> archive=</font><font color="#0000FF">"strapp.jar"</font><font color="#0000AA">
<font color="#555555">013 </font> code=</font><font color="#0000FF">"TrustedApplet.class"</font><font color="#0000AA">
<font color="#555555">014 </font> width=600
<font color="#555555">015 </font> height=200
<font color="#555555">016 </font>></font>
<font color="#555555">017 </font>TrustedApplet Demo
<font color="#555555">018 </font><font color="#0000AA"></applet></font>
<font color="#555555">019 </font>
<font color="#555555">020 </font><font color="#0000AA"></body></font>
<font color="#555555">021 </font><font color="#0000AA"></html></font></pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/TrustedApplet.html"><font color="#000055" size=-1>TrustedApplet.html</font></a></td>
</tr>
</table>
<i>
Listing 48.9: Aufruf des signierten Applets</i></p>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Wir könnten das Applet jetzt wie zuvor starten, würden aber
immer noch dieselbe <a href="index_s.html#ixb102633"><font color=#000080><tt>SecurityException</tt></font></a>
erhalten. Es ist zwar signiert und das Zertifikat ist auf diesem Rechner
bekannt (denn hier wurde es erstellt). Die Policy-Datei ist aber noch
nicht angepasst, und daher lehnt der <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>
des JDK die Ausführung der gefährlichen Operationen nach
wie vor ab.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#000077">
<tr>
<td><font color="#FFFFFF"> Hinweis </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#000077"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel3id048003003"></a>
<h3>48.3.3 Ex- und Import von Zertifikaten </h3>
<p>
Soll das signierte Applet auf anderen Arbeitsplätzen laufen,
ist es erforderlich, das Zertifikat des Schlüssels, mit dem es
signiert wurde, dort zu installieren. Soll es dagegen nur auf dem
Arbeitsplatz laufen, auf dem auch der Schlüssel generiert wurde,
ist das nicht erforderlich. Bei der Generierung des Schlüssels
wurde ja auch ein (selbstsigniertes) Zertifikat erzeugt.
<p>
Um das Zertifikat weitergeben zu können, muss es zunächst
unter Verwendung der Option <font color="#000077"><tt>-export</tt></font>
von <a name="ixa103512"><a href="index_k.html#ixb102608"><font color=#000080><tt>keytool</tt></font></a></a>
aus der lokalen Schlüsseldatenbank exportiert werden:
<font color="#333300">
<pre>
keytool -export -alias hjp3 -file hjp3.cert
</pre>
</font>
<p>
Es liegt nun in der Datei <font color="#660099">hjp3.cert</font> und
kann auf das Zielsystem kopiert werden. Mit der <font color="#000077"><tt>-import</tt></font>-Option
von <a href="index_k.html#ixb102608"><font color=#000080><tt>keytool</tt></font></a>
kann es dort in die Schlüsseldatenbank aufgenommen werden:
<font color="#333300">
<pre>
C:\---><b>keytool -import -alias hjp3 -file hjp3.cert</b>
Enter keystore password: <b>hjp3ks</b>
Owner: CN=Guido Krueger, O=Computer Books, C=de
Issuer: CN=Guido Krueger, O=Computer Books, C=de
Serial number: 38663e2d
Valid from: Sun Dec 26 17:11:25 GMT+01:00 1999 until: Sat Mar 25 17:11:25 GMT+01
:00 2000
Certificate fingerprints:
MD5: D5:73:AB:06:25:16:7F:36:27:DF:CF:9D:C9:DE:AD:35
SHA1: E0:A4:39:65:60:06:48:61:82:5E:8C:47:8A:2B:04:A4:6D:43:56:05
Trust this certificate? [no]: <b>y</b>
Certificate was added to keystore
</pre>
</font>
<p>
Nach dem Aufruf muss zunächst das Paßwort der Schlüsseldatenbank
angegeben werden. Dann zeigt das Programm die Eigenschaften des Zertifikats
an und erwartet, dass die Informationen bestätigt werden. Anschließend
wird das Zertifikat in die Schlüsseldatenbank aufgenommen.
<!-- Section -->
<a name="policydateien"></a>
<h3>48.3.4 Anpassen der <a name="ixa103513">Policy-Datei</a> </h3>
<!-- Section -->
<a name="sectlevel4id048003004001"></a>
<h4>Policy-Dateien </h4>
<p>
Der letzte Schritt besteht darin, die Sicherheitseinstellungen auf
dem Zielsystem anzupassen. Applets, die mit dem Zertifikat verifiziert
werden können, das unter dem Alias »hjp3« in der Schlüsseldatenbank
abgelegt wurde, sollen Dateien im Verzeichnis <font color="#660099">c:\tmp\applets</font>
lesen und schreiben und auf die System-Properties »user.name«,
»user.home« und »user.dir« zugreifen können.
<p>
Die Sicherheitseinstellungen des JDK werden mit Hilfe von Policy-Dateien
definiert. Es gibt zwei Stellen im Dateisystem, von denen das JDK
sie standardmäßig einliest:
<ul>
<li>Die System-Policies befinden sich in der Datei <font color="#660099">java.policy</font><a name="ixa103514"></a>
im Unterverzeichnis <font color="#660099">jre\lib\security</font>
des JDK-Installationsverzeichnisses. Diese Datei braucht normalerweise
nicht verändert zu werden, sie enthält die globalen Sicherheitseinstellungen.
<li>Die benutzerbezogenen Sicherheitseinstellungen können in
der Datei <font color="#660099">.java.policy</font><a name="ixa103515"></a>
abgelegt werden. Sie liegt im Home-Verzeichnis des aktuellen Benutzers.
Auf Windows-95/98-Einzelplatzsystemen liegt sie (wie die Schlüsseldatenbank)
im Verzeichnis <font color="#660099">c:\windows</font>. Diese Datei
ist standardmäßig nicht vorhanden, kann aber leicht selbst
angelegt werden.
</ul>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100%>
<tr>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=1></td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top width=1000>
<p>
Policy-Dateien können auch an beliebigen anderen Stellen im Dateisystem
liegen. In diesem Fall muss beim Aufruf des Java-Interpreters das
System-Property »java.security.policy« mit dem Namen der
zu verwendenen Policy-Datei angegeben werden. Wäre beispielsweise
<font color="#660099">hjp3policy</font> die zu verwendende Policy-Datei,
so müsste der Appletviewer mit der Option »-J-Djava.security.policy=hjp3policy«
aufgerufen werden.</td>
<td><img src="trp1_1.gif" width=2></td>
<td valign=top>
<table border=0 cellspacing=0 cellpadding=1 width=100% bgcolor="#0099CC">
<tr>
<td><font color="#FFFFFF"> Tipp </font></td>
</tr>
</table>
</td>
<td width=1 align=left valign=top bgcolor="#0099CC"><img src="trp1_1.gif"></td>
</tr>
</table>
<!-- Section -->
<a name="sectlevel4id048003004002"></a>
<h4>Das Format einer Policy-Datei </h4>
<p>
Policy-Dateien sind zeilenorientierte Textdateien, die mit einem gewöhnlichen
Texteditor bearbeitet werden können. Alternativ stellt das JDK
ein einfaches GUI-basiertes Hilfsprogramm mit dem Namen <a name="ixa103516"><a href="index_p.html#ixb102638"><font color=#000080><tt>policytool</tt></font></a></a>
zur Verfügung, mit dem Policy-Dateien erstellt und bearbeitet
werden können. Auf seine Verwendung wollen wir aber nicht weiter
eingehen.
<p>
Eine Policy-Datei enthält zwei Arten von Einträgen. Beide
sind optional:
<ul>
<li>Einen »keystore«-Eintrag, der die Lage der Schlüsseldatenbank
angibt.
<li>Beliebig viele »grant«-Einträge, mit denen Berechtigungen
definiert werden.
</ul>
<p>
Alle Einträge werden mit einem Semikolon beendet. Kommentare
können an beliebiger Stelle durch // oder /* ... */ angelegt
werden.
<p>
Der »keystore«-Eintrag erwartet als Argument einen URL,
der auf die Schlüsseldatenbank verweist. Auf einem Windows-98-Einzelplatzsystem
sieht er beispielsweise so aus:
<font color="#000077">
<pre>
keystore "file:/c:/windows/.keystore";
</pre>
</font>
<p>
Die »grant«-Einträge haben folgende Syntax:
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#EEFFCC">
<tr>
<td valign=top width=100%>
<font color="#660066">
<pre>
grant [SignedBy "<i>signer</i>"] [, CodeBase "<i>URL</i>"] {
permission permission_class [ "<i>target</i>" ] [, "<i>action</i>"]
[, SignedBy "<i>signers</i>"];
...
};
</pre>
</font>
</td>
</tr>
</table>
<p>
Eine Berechtigung kann wahlweise an einen Unterzeichner oder eine
Ladeadresse (oder beide) vergeben werden. Die Option »SignedBy«
führt eine Liste von Aliasnamen auf, deren Zertifikate vorhanden
sein müssen, damit die Berechtigung gewährt wird. Die Option
»CodeBase« spezifiziert die Adresse, von der ein Applet
geladen werden darf, um die Berechtigung zu halten. Fehlt die CodeBase-Klausel,
wird nur die Unterzeichnerliste verwendet; fehlt die SignedBy-Klausel,
ist es nur die Ladeadresse.
<p>
Nach einer öffnenden geschweiften Klammer folgen beliebig viele
Berechtigungen, die jeweils durch das Schlüsselwort »permission«
eingeleitet werden. Anschließend wird der Eintrag mit einer
schließenden geschweiften Klammer abgeschlossen. Der zuvor spezifizierte
Berechtigte erhält alle Berechtigungen, die zwischen den beiden
Klammern angegeben sind.
<p>
Jede Berechtigung muss als erstes Argument den Namen einer Berechtigungsklasse
angeben. Daneben kann sie zwei weitere Argumente <i>target</i> und
<i>action</i> haben, mit denen Details spezifiziert werden. <a href="k100305.html#policypermissions">Tabelle 48.1</a>
listet die gebräuchlichsten Berechtigungen und ihre Argumente
auf. Details können (und müssen) in dem Dokument »Java
Security Architecture« nachgelesen werden, das Bestandteil der
JDK-Dokumentation ist. <a name="policypermissions"></a>
<p>
<table cols=4 border width=100%>
<tr>
<td valign=top align=left width=25%><b>Klasse</b></td>
<td valign=top align=left width=25%><b>Zugriff auf</b></td>
<td valign=top align=left width=25%><b>Target</b></td>
<td valign=top align=left width=25%><b>Action </b></td></tr>
<tr>
<td valign=top align=left><a name="ixa103517"><a href="index_f.html#ixb102639"><font color=#000080><tt>java.io.FilePermission</tt></font></a></a></td>
<td valign=top align=left>Dateien und Verzeichnisse</td>
<td valign=top align=left>Datei- oder Verzeichnisnamen. Wird als letztes
Zeichen ein »*« angegeben, so gilt die Berechtigung für
das komplette Verzeichnis. Steht dort ein »-«, so gilt sie
zusätzlich für alle Unterverzeichnisse. Wird »<<ALL
FILES>>« angegeben, gilt die Berechtigung für alle
Dateien in allen Verzeichnissen!</td>
<td valign=top align=left>read, write, delete, execute </td></tr>
<tr>
<td valign=top align=left><a name="ixa103518"><a href="index_s.html#ixb102640"><font color=#000080><tt>java.net.SocketPermission</tt></font></a></a></td>
<td valign=top align=left>TCP/IP-Verbindungen</td>
<td valign=top align=left>Hostname oder IP-Adresse, gefolgt von Portnummern-Bereich</td>
<td valign=top align=left>accept, connect, listen, resolve </td></tr>
<tr>
<td valign=top align=left><a name="ixa103519"><a href="index_p.html#ixb102641"><font color=#000080><tt>java.util.PropertyPermission</tt></font></a></a></td>
<td valign=top align=left>System-Properties</td>
<td valign=top align=left>Names des Properties</td>
<td valign=top align=left>read, write </td></tr>
<tr>
<td valign=top align=left><a name="ixa103520"><a href="index_r.html#ixb102642"><font color=#000080><tt>java.lang.RuntimePermission </tt></font></a></a></td>
<td valign=top align=left>Die Klasse Runtime</td>
<td valign=top align=left>exitVM, stopThread, loadLibrary, queuePrintJob,
...</td>
<td valign=top align=left>- </td></tr>
<tr>
<td valign=top align=left><a name="ixa103521"><a href="index_a.html#ixb102643"><font color=#000080><tt>java.awt.AWTPermission</tt></font></a></a></td>
<td valign=top align=left>Window-Ressourcen</td>
<td valign=top align=left>accessClipboard, showWindowWithoutWarningBanner,
...</td>
<td valign=top align=left>- </td></tr>
<tr>
<td valign=top align=left><a name="ixa103522"><a href="index_a.html#ixb102644"><font color=#000080><tt>java.security.AllPermission</tt></font></a></a></td>
<td valign=top align=left>Alle Ressourcen</td>
<td valign=top align=left>-</td>
<td valign=top align=left>- </td></tr>
</table>
<p><i>
Tabelle 48.1: Wichtige Permission-Klassen</i></p>
<!-- Section -->
<a name="sectlevel4id048003004003"></a>
<h4>Erstellen der Policy-Datei </h4>
<p>
Nach diesen Vorbemerkungen können wir die Policy-Datei <font color="#660099">\windows\.java.policy</font>
erstellen. Sie hat folgenden Inhalt:
<font color="#000077">
<pre>
keystore "file:/c:/windows/.keystore";
grant SignedBy "hjp3" {
permission java.io.FilePermission "c:\\tmp\\applets\\*", "read,write";
permission java.util.PropertyPermission "user.name", "read";
permission java.util.PropertyPermission "user.home", "read";
permission java.util.PropertyPermission "user.dir", "read";
};
</pre>
</font>
<p>
Im ersten Eintrag geben wir die Position der Schlüsseldatenbank
an, sie liegt im Verzeichnis <font color="#660099">c:\windows</font>.
Anschließend definieren wir die Berechtigungen für alle
Applets, die mit dem Zertifikat »hjp3« signiert wurden.
Zunächst erhalten sie Schreib- und Leseberechtigung im Verzeichnis
<font color="#660099">c:\tmp\applets</font>. Dort können sie
ohne weitere Einschränkungen Dateien anlegen, überschreiben
und lesen. Zusätzlich erlauben wir den so signierten Applets,
die drei System-Properties »user.name«, »user.home«
und »user.dir« zu lesen.
<p>
Nun läßt sich unser signiertes Applet ohne <a href="index_s.html#ixb102633"><font color=#000080><tt>SecurityException</tt></font></a>
aufrufen und gibt die erlösende Meldung »Alle Sicherheitshuerden
ueberwunden« aus. Im Verzeichnis <font color="#660099">c:\tmp\applets</font>
sollte sich anschließend eine Datei <font color="#660099">TrustedApplet.log</font>
befinden und etwa folgenden Inhalt haben:
<font color="#333300">
<pre>
Erzeugt von Applet: 30.12.1999 20:50:40
user.name=Guido Krüger
user.home=C:\WINDOWS
user.dir=C:\arc\doku\hjp3\misc
</pre>
</font>
<!-- Section -->
<a name="sectlevel3id048003005"></a>
<h3>48.3.5 Die Klasse SecurityManager </h3>
<p>
Die Prüfung der Zugriffsberechtigungen wird mit Hilfe der Klasse
<a name="ixa103523"><a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a></a>
aus dem Paket <a href="index_j.html#ixb100188"><font color=#000080><tt>java.lang</tt></font></a>
vorgenommen. Der <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>
ist ein Objekt, das entweder gar nicht oder genau einmal im laufenden
Java-Programm vorhanden ist. Nach der ersten Instanzierung kann es
nicht mehr geändert oder entfernt werden.
<p>
Zugriffe auf den <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>
sind an den Stellen der Laufzeitbibliothek eingebaut, an denen auf
gefährliche Ressourcen zugegriffen wird. Ein Beispiel aus der
Klasse <a href="index_f.html#ixb101034"><font color=#000080><tt>FileInputStream</tt></font></a>
sieht etwa so aus:
<font color="#000077">
<pre>
...
SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkRead(name);
}
//Gefährlicher Code
...
</pre>
</font>
<p>
Zunächst wird geprüft, ob ein <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>
installiert wurde. Ist das nicht der Fall, fährt das Programm
ohne Einschränkung fort. Gibt es dagegen einen <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>,
wird dessen <a name="ixa103524"><a href="index_c.html#ixb102645"><font color=#000080><tt>checkRead</tt></font></a></a>-Methode
aufgerufen. Sie löst eine <a href="index_s.html#ixb102633"><font color=#000080><tt>SecurityException</tt></font></a>
aus, wenn die gewünschte Berechtigung fehlt. Der Code hinter
dem <a href="index_c.html#ixb102645"><font color=#000080><tt>checkRead</tt></font></a>
wird in diesem Fall nicht mehr erreicht. Ist die Berechtigung dagegen
vorhanden, wird <a href="index_c.html#ixb102645"><font color=#000080><tt>checkRead</tt></font></a>
ohne weitere Aktionen beendet und der dahinter liegende Code ausgeführt.
<p>
Applets besitzen grundsätzlich einen <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>.
Der AppletViewer bzw. Web-Browser sorgen während der Initialisierung
für dessen Instanzierung. Applikationen dagegen haben normalerweise
keinen <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>
(das ist der Grund, weshalb in Applikationen alle gefährlichen
Operationen erlaubt sind). Soll eine Applikation einen <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>
erhalten, so kann sie entweder mit der Option »-Djava.security.manager«
gestartet werden, oder der <a href="index_s.html#ixb102565"><font color=#000080><tt>SecurityManager</tt></font></a>
kann im Programm selbst installiert werden:
<font color="#000077">
<pre>
...
System.setSecurityManager(new SecurityManager());
...
</pre>
</font>
<p>
Das folgende Beispielprogramm gibt den Inhalt des System-Properties
»user.name« aus. Normalerweise kann es ohne Fehler ausgeführt
werden:
<a name="syspropusername"></a>
<p>
<table border=0 cellspacing=0 cellpadding=0 width=100% bgcolor="#DDDDDD">
<tr>
<td valign=top>
<font color="#000055">
<pre>
<font color="#555555">001 </font><font color="#00AA00">/* SecuMgrTest.java */</font>
<font color="#555555">002 </font>
<font color="#555555">003 </font><font color="#0000AA">public</font> <font color="#0000AA">class</font> SecuMgrTest
<font color="#555555">004 </font>{
<font color="#555555">005 </font> <font color="#0000AA">public</font> <font color="#0000AA">static</font> <font color="#006699">void</font> main(String[] args)
<font color="#555555">006 </font> {
<font color="#555555">007 </font> System.out.println(
<font color="#555555">008 </font> <font color="#0000FF">"user.name is "</font> + System.getProperty(<font color="#0000FF">"user.name"</font>)
<font color="#555555">009 </font> );
<font color="#555555">010 </font> }
<font color="#555555">011 </font>}</pre>
</font>
</td>
<td valign=top align=right>
<a href="../examples/SecuMgrTest.java"><font color="#000055" size=-1>SecuMgrTest.java</font></a></td>
</tr>
</table>
<i>
Listing 48.10: Ausgeben des System-Properties »user.name«</i></p>
<p>
Läuft es dagegen unter Kontrolle eines SecurityManagers, so führt
der Aufruf zu einer <a href="index_s.html#ixb102633"><font color=#000080><tt>SecurityException</tt></font></a>:
<font color="#333300">
<pre>
C:\---><b>java -Djava.security.manager SecuMgrTest</b>
Exception in thread "main"
java.security.AccessControlException: access denied
(java.util.PropertyPermission user.name read)
at java.security.AccessControlContext.checkPermission(
AccessControlContext.java:276)
at java.security.AccessController.checkPermission(
AccessController.java:403)
at java.lang.SecurityManager.checkPermission(
SecurityManager.java:549)
at java.lang.SecurityManager.checkPropertyAccess(
SecurityManager.java:1242)
at java.lang.System.getProperty(System.java:555)
at Test1.main(SecuMgrTest.java:7)
</pre>
</font>
<p>
Bei Bedarf kann man Applikationen auf diese Weise mit denselben Sicherheitsmechanismen
ausstatten wie Applets. jar-Dateien, aus denen Applikationen geladen
werden, lassen sich ebenso signieren wie solche, aus denen Applets
geladen werden. Die in der Policy-Datei definierten Rechte gelten
dann für die daraus gestartete Applikation.
<hr>
<table border=0 cellpadding=0 cellspacing=1 width="100%">
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="cover.html"> Titel </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100003.html"> Inhalt </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="search.html"> Suchen </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="index.html"> Index </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/index.html" onClick="this.href=getDocIndex()"> DOC </a>
<td align="right">Handbuch der Java-Programmierung, 5. Auflage, Addison
Wesley, Version 5.0.1
<tr bgcolor="#EEFFCC">
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100302.html"> << </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100304.html"> < </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100306.html"> > </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="k100307.html"> >> </a>
<td width="7%" align=center bgcolor="#DDCC99"><a href="../jdkdocs/api/index.html" onClick="this.href=getApiIndex()"> API </a>
<td align="right">© 1998, 2007 Guido Krüger & Thomas
Stark, <a href="http://www.javabuch.de">http://www.javabuch.de</a>
</table>
<a name="endofbody"></a>
</body>
</html>
|