# SSL-Zertifikat in Java-Webanwendungen laden



## andi1337 (2. Apr 2009)

Hallo,

ich bin totaler Neuling im Gebiet der Java-Webanwendungen und finde wahrscheinlich deshalb keine Lösung für mein Problem. Ich hoffe, dass mir hier jemand helfen kann.
Mein Problem ist folgendes:

Ich möchte eine Java-Webanwendung schreiben, die mir Informationen eines bereits im Browser importierten Zertifikats ausgibt, wie z.B. den publicKey, SubjetAlternativeName, usw. Das ganze existiert bereits in php, jedoch benötige ich es in Java.

Hier kann man sich das ganze einmal in php anschauen, da ja ein praktisches Beispiel immer besser ist, als wenn ich es hier mit Text beschreibe.
Also zuerst ein Zertifikat erstellen und runterladen ->Simple Create Client Certificate Page
Dann das soeben runtergeladene Zertifikat in den Browser importieren.
Und am Ende einloggen, wobei hier ein Dialog erscheint, wo man eines der importierten Zertifikate auswählen kann. Hier werden dann Informationen zu dem ausgewählten Zertifikat angezeigt. -> Login Test Page
Leider ist das Ganze in php gemacht.

Um es nochmal deutlicher zu machen: Meine Frage bezieht sich eigentlich nur auf den letzten Teil, es geht mir nicht darum, ein Zertifikat zu erstellen. Theoretisch möchte ich also einfach eine Java-Webanwendung, wo ich ein bereits im Browser importiertes Zertifikat zu Beginn auswählen kann und anschließend Informationen auslesen kann. Ist das ganze überhaupt möglich? Dabei ist mir egal, was benutzt werden soll, ob JSP, JSF, Struts oder etwa Apache Wicket ;-)

Viele Grüße und schonmal danke für die Hilfe,

Andi


----------



## gex (2. Apr 2009)

Hi, wenn ich dich richtig verstehe willst du den Login mittels client certificate erreichen oder?

Nun bei Java Webapps sollte dafür HTTPS Client Authentication als Authentication Mechanism verwendent werden.
Siehe Defining Security Requirements for Web Applications - The Java EE 5 Tutorial

Details sind dann jedoch vom eingesetzen Application Server abhängig. Bei JavaSE Anwendungen würde dies anderns aussehen (vermutlich auf Socket Level), aber dies ist im JavaEE Umfeld nicht den zu beschreitende Weg 

Gruss


----------



## andi1337 (3. Apr 2009)

Hallo,

vielen Dank schonmal für die Antwort. Ja, am Ende soll es sowas wie ein Login mittels Client Zertifikat sein. 
Ich bin mir nicht sicher, ob die HTTPS Client Authentication genau das ist, was ich suche. Also wie gesagt, ich möchte einfach zu Beginn eins von den importierten Zertifikaten auswählen können und dann Information davon ausgeben lassen, wie z.B. den OrganisationName, publicKey, SubjectAlternativeName, usw. Also mein Java-Code sollte einfach eine HTML-Seite erzeugen, wo mir diese Infos angezeigt werden.
Hat irgendwer schonmal etwas ähnliches implementiert? 

Viele Grüße,
Andi


----------



## andi1337 (19. Apr 2009)

Hallo mal wieder,

habe das Problem gelöst. Falls jemand auch mal dieses Problem haben sollte, hier der Lösungsweg:
Konfigurationsdatei für SSL konfigurieren. Der entsprechende Eintrag für den Connector in der server.xml sieht folgendermaßen aus:
[XML]
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
       maxThreads="150" scheme="https" secure="true"
       keystoreFile="..." keystorePass="..."
       truststoreFile=".." truststorePass="..."
       SLImplementation="org.jsslutils.extra.apachetomcat6.JSSLutilsImplementation"
       acceptAnyCert="true" clientAuth="want" sslProtocol="TLS" />
[/XML]
Hier ist zu bemerken, dass ich noch eine zusätzliche Bibliothek in den Lib-Ordnder des Tomcats kopiert habe (JSSLutilsImplementation), damit jedes Client-Zertifikat vom Tomcat akzeptiert wird. Die keystore- und truststore-Parameter dürften eigentlich überflüssig sein, wurde aber noch nicht getestet. 
Im Servlet meiner Java-Webapplikation wurde folgender Eintrag noch hinzugefügt:
[XML]
<login-config>
        <auth-method>CLIENT-CERT</auth-method>
</login-config>
[/XML]
Die folgende JSP-Datei liest dann das entsprechende Zertifikat aus:

```
<%
            X509Certificate[] certs = (X509Certificate[]) request.getAttribute("javax.servlet.request.X509Certificate");
            if (certs != null) {

            X509Certificate cert = certs[0];
%>
```
Obwohl das wahrscheinlich der übliche Weg ist, der mir leider nicht geläufig war, hoffe ich, dass es vielleicht noch anderen weiterhilft ;-)

Viele Grüße,
Andi


----------



## gex (19. Apr 2009)

Hallo

Danke für den Post, toll dass du die Lösung noch gepostet hast!

Gruss


----------

