49 Stimmen

Tomcat Server/Client Selbstsigniertes SSL-Zertifikat

Ich habe einen Apache Tomcat 6.x Server, der mit einem selbstsignierten SSL-Zertifikat läuft. Ich möchte, dass der Client dem Server sein eigenes Zertifikat vorlegt, damit ich ihn auf der Grundlage einer Datenbank mit Benutzern authentifizieren kann. Ich habe alles auf der Grundlage eines Beispiels, das ich im Internet gefunden habe, eingerichtet, aber das Beispiel enthielt vorgefertigte Zertifikate und einen vorgefertigten JKS-Datenspeicher. Ich möchte meinen eigenen Datenspeicher mit meinen eigenen Zertifikaten erstellen, aber ich habe kein Glück.

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

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

Ich habe jetzt viele Stunden mit dem Java Keytool gespielt.

63voto

davidemm Punkte 1929

Endlich habe ich die Lösung für mein Problem gefunden. Ich werde die Ergebnisse hier posten, falls jemand anders nicht weiterkommt.

Dank an Michael Martin von Michaels Software-Gedanken und -Abschweifungen Das habe ich entdeckt:

keytool verwendet standardmäßig das DSA Algorithmus bei der Erzeugung des selbstsignierten Zertifikats. Frühere Versionen von Firefox akzeptierten diese Schlüssel ohne Problem. Mit Firefox 3 Beta 5 funktioniert die Verwendung von DSA nicht, aber die Verwendung von RSA funktioniert. Die Übergabe von "-keyalg RSA" bei der Erzeugung des selbstsignierten Zertifikats erzeugt ein Zertifikat, das Firefox 3 beta 5 vollständig akzeptiert.

Ich habe einfach dieses Flag gesetzt, alle Caches in FireFox geleert und es funktionierte wie ein Zauber! Ich verwende dies als Test-Setup für mein Projekt und muss dies mit anderen Leuten teilen, also habe ich ein kleines Batch-Skript geschrieben, das zwei SSL-Zertifikate erstellt. Eines kann in das Tomcat-Setup eingefügt werden und das 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 "password" (ohne Anführungszeichen). Ändern Sie die hart kodierten Bits nach Ihren Bedürfnissen.

@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

Das Ergebnis sind zwei Dateien. Eine mit dem Namen server.jks, die Sie in Tomcat ablegen, und eine weitere Datei mit dem Namen {username}.p12, die Sie in Ihren Browser importieren. In der Datei server.jks ist das Client-Zertifikat als vertrauenswürdiges Zertifikat hinzugefügt.

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

Und hier ist das XML, das der Tomcat-Datei conf/sever.xml hinzugefügt werden muss (nur mit 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" />

3voto

erickson Punkte 256579

Um die Client-Authentifizierung zu ermöglichen, müssen Sie einen "Trust Store" für Tomcat angeben: einen Schlüsselspeicher, der Zertifikate von den Root-Zertifizierungsstellen enthält, denen Sie vertrauen und die jeweils als "trustEntry" gekennzeichnet sind.

Dies wird durch den Parameter Connector die Attribute des Elements: truststoreFile , truststorePass (der standardmäßig auf den Wert von keystorePass ), y truststoreType (die standardmäßig "JKS" lautet).

Wenn ein Client ein selbstsigniertes Zertifikat verwendet, ist seine "Root"-Zertifizierungsstelle das Zertifikat selbst. Daraus folgt, dass Sie das selbstsignierte Zertifikat des Clients in den Vertrauensspeicher von Tomcat importieren müssen.

Wenn Sie viele Kunden haben, wird das schnell zu einem Problem. In diesem Fall sollten Sie sich überlegen, ob Sie nicht Zertifikate für Ihre Kunden signieren wollen. Die Java keytool Befehl kann dies nicht, aber alle notwendigen Befehlszeilen-Dienstprogramme sind in OpenSSL verfügbar. Oder Sie könnten sich mit etwas wie EJBCA in großem Maßstab.

Besser noch: Bitten Sie Ihre Kunden, eine bestehende kostenlose CA zu nutzen, z. B. startcom.org . Dies funktioniert bei Serverzertifikaten nicht immer, da das StartCom-Zertifikat nicht in allen Browsern enthalten ist, aber diese Situation ist umgekehrt, und das StartCom-Root-Zertifikat kann problemlos in den Tomcat-Vertrauensspeicher importiert werden.

2voto

Jon Punkte 58858

Zertifikat erstellen:

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

Geben Sie alle Daten für das benötigte selbstsignierte Zertifikat ein und bearbeiten Sie dann Tomcats server.xml und geben Sie die Eigenschaften des Schlüsselspeichers für den SSL-Anschluss an, z. B:

<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 folgen Sie den Tomcat-Dokumenten...

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

1voto

Eric Punkte 18690

Die vorherigen Antworten sind für mich nützlich, aber ich habe keine Version des Shell-Tools. Also habe ich eine 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

について tomcat8 können Sie folgende Konfiguration hinzufügen server.xml :

    <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"
    />

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X