2009-07-24 19 views
42

Ich habe einen Apache Tomcat 6.x-Server mit einem selbstsignierten SSL-Zertifikat. Ich möchte, dass der Client dem Server ein eigenes Zertifikat vorlegt, damit ich ihn anhand einer Datenbank von Benutzern authentifizieren kann. Ich habe alles funktioniert basierend auf einem Beispiel, das ich online gefunden habe, aber das Beispiel kam mit vorgefertigten Zertifikaten und einem vorgebauten JKS Datenspeicher. Ich möchte meinen eigenen Datenspeicher mit meinen eigenen Zertifikaten erstellen, habe aber kein Glück.Tomcat Server/Client Selbstsigniertes SSL-Zertifikat

Wie erstelle ich einen Datenspeicher für Tomcat?
Wie erstelle ich ein selbstsigniertes Zertifikat für Tomcat?

Wie erstelle ich ein selbstsigniertes Zertifikat für den Client?
Wie zwinge ich Tomcat, der Signatur des Clients zu vertrauen?

Ich habe seit vielen Stunden mit Java Keytool gespielt.

Antwort

59

Endlich habe ich die Lösung für mein Problem, also werde ich die Ergebnisse hier posten, wenn jemand anderes steckenbleibt.

Dank Michael Martin von Michael's Software Thoughts & Ramblings entdeckte ich, dass:

Keytool standardmäßig die DSA Algorithmus verwendet, wenn die selbst signiertes Zertifikat zu generieren.Frühere Versionen von Firefox akzeptiert diese Schlüssel ohne Problem. Mit Firefox 3 Beta 5, mit DSA funktioniert nicht, aber mit RSA tut. Übergabe "-keyalg RSA" bei der Generierung das selbstsignierte Zertifikat erstellt eine cert die Firefox 3 Beta 5 vollständig akzeptiert.

Ich habe einfach diese Flagge gesetzt, alle Caches in FireFox gelöscht und es funktionierte wie ein Zauber! Ich benutze dies als Test-Setup für mein Projekt und ich muss dies mit anderen Leuten teilen, also schrieb ich ein kleines Batch-Skript, das zwei SSL-Zertifikate erstellt. Einer kann in das Tomcat-Setup eingefügt werden und der andere ist eine .p12-Datei, die in FireFox/IE importiert werden kann. Vielen Dank!

Verwendung: Das erste Befehlszeilenargument ist der Benutzername des Clients. Alle Passwörter sind "Passwort" (ohne Zitate). Ändern Sie eines der hartcodierten Bits, um Ihre Anforderungen zu erfüllen.

@echo off 
if "%1" == "" goto usage 

keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password 
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password 
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password 
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password 
keytool -list -v -keystore server.jks -storepass password 
del %1.cer 
goto end 

:usage 
echo Need user id as first argument: generate_keystore [username] 
goto end 

:end 
pause 

Die Ergebnisse sind zwei Dateien. Eine namens server.jks, die Sie in Tomcat einfügen, und eine andere Datei namens {username} .p12, die Sie in Ihren Browser importieren. In der Datei server.jks ist das Clientzertifikat als vertrauenswürdiges Zertifikat hinzugefügt.

Ich hoffe, dass jemand anderes das nützlich findet.

Und hier ist das die XML, die Ihren Tomcat conf/sever.xml Datei hinzugefügt werden muss (nur auf Tomcat 6.x getestet)

<Connector 
    clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75" 
    enableLookups="true" disableUploadTimeout="true" 
    acceptCount="100" maxThreads="200" 
    scheme="https" secure="true" SSLEnabled="true" 
    keystoreFile="${catalina.home}/conf/server.jks" 
    keystoreType="JKS" keystorePass="password" 
    truststoreFile="${catalina.home}/conf/server.jks" 
    truststoreType="JKS" truststorePass="password" 
    SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS" 
/> 

Für Tomcat 7:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" 
      port="8443" SSLEnabled="true" 
      maxThreads="200" scheme="https" secure="true" 
      keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password" 
      clientAuth="false" sslProtocol="TLS" />  
+1

Vielen Dank dafür! Ich habe den ganzen Tag mit verschiedenen "Tutorials" herumgespielt und dies ist das erste, mit dem wirklich gearbeitet wurde mit clientAuth = "true ". –

+0

Dies ist eine schöne Antwort. Ich habe zu viel Zeit mit der Fledermaus-Datei gespeichert. Und das Beste von allem ist, dass es perfekt funktioniert." – Yster

2

Zertifikat erstellen:

keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore 

all Geben Sie die Daten für das selbst signiertes Zertifikat Sie müssen dann server.xml Tomcat bearbeiten und die Schlüsselspeicher-Eigenschaften auf dem SSL-Anschluss angeben, zum Beispiel:

<Connector port="8443" maxHttpHeaderSize="8192" 
     maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
     enableLookups="false" disableUploadTimeout="true" 
     acceptCount="100" scheme="https" secure="true" 
     keystoreFile="/home/bob/mykeystore" 
     clientAuth="false" sslProtocol="TLS" /> 

oder die Tomcat-Dokumentation folgen ...

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

+3

ich, dass früher gesehen und es hat meine Hälfte meine Antwort, aber Ihnen fehlt der schwierigere Teil. Wie verwende ich selbstsignierte Client-Zertifikate? In dem von Ihnen bereitgestellten Beispiel heißt es "clientAuth = 'false'." Ich brauche es, wenn es auf "true" gesetzt ist. "Setzen Sie diesen Wert auf" true ", wenn Tomcat von allen SSL-Clients verlangen soll, ein Clientzertifikat zu präsentieren, um diesen Socket zu verwenden." Das ist was ich will Ich kann den Server nicht dazu bringen, das selbstsignierte Zertifikat des Clients zu akzeptieren. – davidemm

3

Um die Client-Authentifizierung zu aktivieren, müssen Sie für Tomcat einen "Trust Store" angeben: einen Schlüsselspeicher, der Zertifikate von vertrauenswürdigen Stammzertifizierungsstellen enthält, die jeweils als "trustEntry" gekennzeichnet sind.

Dies wird durch die Attribute des Connector Element angegeben wird: truststoreFile, truststorePass (die Standardwerte auf den Wert von keystorePass) und truststoreType (welche standardmäßig "JKS").

Wenn ein Client ein selbstsigniertes Zertifikat verwendet, ist seine Stammzertifizierungsstelle das Zertifikat selbst. Daraus folgt, dass Sie das selbstsignierte Zertifikat des Clients in den Trust Store von Tomcat importieren müssen.

Wenn Sie viele Kunden haben, wird dies schnell zu einer Hektik. In diesem Fall sollten Sie nach Unterschriftszertifikaten für Ihre Clients suchen. Der Java-Befehl keytool kann dies nicht, aber alle erforderlichen Befehlszeilenprogramme sind in OpenSSL verfügbar. Oder Sie könnten in etwas wie EJBCA in großem Maßstab suchen.

Besser noch, bitten Sie Ihre Kunden, eine vorhandene freie CA zu verwenden, wie startcom.org. Dies funktioniert nicht immer für Serverzertifikate, da das StartCom-Zertifikat nicht in allen Browsern enthalten ist, aber diese Situation ist umgekehrt und das StartCom-Stammzertifikat kann problemlos in den Tomcat-Truststore importiert werden.

1

Die vorherigen Antworten sind nützlich für mich, haben aber keine Shell-Tool-Version. Also habe ich einen geschrieben.

key_gen.sh:

#! /bin/bash 
# a key generator for https, 

basename=server 
key_algorithm=RSA 
password_key=123456 
password_store=123456 
country=US 

# clean - pre 
rm "${basename}.jks" 

# generate server side 
keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store 

Für tomcat8 könnte folgende config server.xml hinzufügen:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" 
     maxThreads="150" SSLEnabled="true" scheme="https" secure="true" 
     clientAuth="false" sslProtocol="TLS" 
     acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456" 
    />