Hamster-SSL-FAQ von Philipp Wendler


Version: 3.5

Warnung:
Das ist die FAQ zur Benutzung mit einem Hamster, der eine eingebaute SSL-Unterstützung besitzt und kein STunnel mehr benötigt, also dem Hamster Classic ab Version 2.0.0.0. Für Hamster, die noch STunnel benötigen (z.B. Hamster Classic vor Version 1.3.23.140), sollte die dafür gedachte FAQ von mir benutzt werden. Sie ist zu finden unter: http://www.philippwendler.de/hamster/hamster-ssl-stunnel.txt

Inhaltsverzeichnis:

  1. Wie benutze ich mit dem Hamster SSL?
    1. Wie kann ich über das Online-Menü SSL nutzen?
    2. Wie kann ich meine Mails mit Hamster-Skripten oder per OLE über eine SSL-Verbindung abholen und verschicken?
      1. Wenn HamMailExchange im Skript bzw. ControlRunMail per OLE verwendet wird
      2. Wenn HamFetchMail im Skript bzw. ControlRunFetchMail per OLE verwendet wird
      3. Wenn HamSendMail / HamSendMailAuth im Skript bzw. ControlRunSendMail / ControlRunSendMailAuth per OLE verwendet wird
    3. Wie kann ich meine News über eine SSL-Verbindung abholen und verschicken?
  2. Hamster als SSL-Server
  3. Wie erhöhe ich die Sicherheit bei SSL?
  4. Was sind Zertifikate und wozu brauche ich sie?
  5. Wo bekomme ich fremde Zertifikate her?
    1. CA-Zertifikate
    2. Serverzertifikate
  6. Wie erstelle ich mir ein eigenes Zertifikat?
  7. Wie mache ich dem Hamster fremde Zertifikate bekannt?
    1. Alle Zertifikate in einer Datei
    2. Alle Zertifikate in einem Verzeichnis
  8. Wie benutze ich Zertifikate mit Hamster und SSL?
    1. Serverzertifikate
      1. Einrichten mit dem Hamster als Server
      2. Einrichten mit dem Hamster als Client
        1. Überprüfen des CA-Zertifikates
        2. Überprüfen des Serverzertifikates
    2. Clientzertifikate
      1. Einrichten mit dem Hamster als Server
      2. Einrichten mit dem Hamster als Client
  9. Was bedeuten diese Fehlermeldungen?
  10. Wo bekomme ich OpenSSL her?
  11. Was für interessante URLs gibt es zu diesem Thema?


1) Wie benutze ich mit dem Hamster SSL?

Folgendes wird benötigt: Diese ersten Schritte sind immer nötig:

Kopiere die beiden OpenSSL-DLLs, die du kompiliert oder heruntergeladen hast, in das Hamsterhauptverzeichnis oder ein Verzeichnis, das in der Umgebungsvariable %PATH% enthalten ist. Starte dann den Hamster neu.

Zu erst einmal musst du herausfinden, ob der Server TLS oder SSL über einen separaten Port unterstützt. Das steht oft auf der Website des Providers. Außerdem gibt es auf meiner Homepage eine Liste mit POP3- und SMTP-Servern und den von ihnen unterstützten Möglichkeiten.

Wenn der Server SSL auf einem separaten Port unterstützt, und du dir die Portnummern nicht merken kannst, öffne die Datei "services" (ohne Endung!). Bei Windows 95 bis Windows ME liegt sie im Windows-Verzeichnis, bei Windows NT und Nachfolgern im Verzeichnis %SYSTEMDIR%\drivers\etc (normalerweise c:\windows\system32\drivers\etc). Füge folgende Zeilen ein und speichere sie unter demselben Namen:

smtps           465/tcp
nntps           563/tcp
imaps           993/tcp
pop3s           995/tcp

Jetzt kannst du überall statt Port 465 "smtps", statt Port 563 "nntps" und statt Port 995 "pop3s", also den Standardportnamen mit angehängtem "s" angeben.

Beachte im folgenden, dass es bei zwei oder mehr verschlüsselten Verbindungen gleichzeitig und wenig Hauptspeicher Probleme wegen Speichermangels geben kann. Sollte die Fehlermeldung "library has no ciphers - Creating SSL context failed" im Hamsterlog auftreten, musst du die Zahl der gleichzeitigen verschlüsselten Verbindungen (auch mehrere Threads zu einem Newsserver zählen dazu) reduzieren.

1.1) Wie kann ich über das Online-Menü SSL nutzen?

Wenn der Server TLS unterstützt, trage den Server ganz normal ein und stelle die erste Auswahlliste in den "SSL-Einstellungen" auf "TLS immer nutzen". Dazu müssen temporär die erweiterten Einstellungen aktiviert werden. Wenn der Server öftersmal Probleme mit dem TLS hat, und du dann lieber über eine unsichere Verbindung abfragst, als gar nicht, kannst du es auch auf "TLS nutzen, wenn möglich" stellen.

Wenn der Server kein TLS unterstützt, dafür aber SSL über einen separaten Port, trage den Server in den Hamster ein, setze die Auswahlliste auf "SSL bei sicherem Port immer nutzen" und ersetze den Standardport (meist angegeben mit dem Protokollnamen) durch den SSL-Port. Das ist normalerweise 995 bei POP3-SSL, 465 bei SMTP-SSL und 563 bei NNTP-SSL.

Wenn du jetzt über das Online-Menü eine Verbindung zu diesem Server aufbaust, wird eine SSL-Verbindung aufgebaut. Vergiss aber nicht, falls vorhanden, denselben Server ohne SSL aus der Gruppe im Online-Menü herauszunehmen. Das ist sonst ein Sicherheitsrisiko, da zusätzlich noch eine unverschlüsselte Verbindung aufgebaut wird und dein Passwort wieder unverschlüsselt übertragen wird.

Beachte, dass du dir ohne Zertifikat nicht sicher sein kannst, dass du auch wirklich mit dem gewollten Server sprichst. Du solltest dir also das Zertifikat beschaffen und benutzen. Mit der Auswahlbox "Wähle Überprüfungsverfahren" kannst du die verwendete Stufe einstellen. Bei "Zertifikate immer überprüfen" wird nur das Zertifikat der CA und die Signatur des Serverzertifikats überprüft. Bei "Peer mittels lokal vorhandener Zertifikate überprüfen" wird zusätzlich das Serverzertifikat selber überprüft. Zum Feld "Überprüfung über Datei" siehe Frage 7).

1.2) Wie kann ich meine Mails mit Hamster-Skripten oder per OLE über eine SSL-Verbindung abholen und verschicken?

1.2.1) Wenn HamMailExchange im Skript bzw. ControlRunMail per OLE verwendet wird

Folge einfach den Anweisungen in Frage 1) und 1.1).

Beachte, dass in der Serverliste, die übergeben wird, eventuell der Port geändert werden muss.

1.2.2) Wenn HamFetchMail im Skript bzw. ControlRunFetchMail per OLE verwendet wird

Ergänze den HamFetchMail-Befehl im Skript um die SSL-Parameter. Mindestens SSLMode muss bei SSL-Benutzung immer angeben werden, da der Hamster die SSL-Einstellungen, die eventuell im Menü für diesen Server gemacht wurden, nicht übernimmt. Die anderen SSL-Parameter können weggelassen werden, dann nimmt der Hamster die Standardwerte (SSLVerify = 0; SSLCaFile = "").

HamFetchMail( <server>, <port>, <user>, <pass>, <destuser>, <filter>, <LeaveOnServer>, <SSLMode>, <SSLVerify>, <SSLCaFile> )

Per OLE musst du jetzt den neuen Befehl ControlRunFetchMailTLS statt ControlRunFetchMail verwenden.

function ControlRunFetchMailTLS( <server>: WideString; <port>: WideString; <user>: WideString; <pass>: WideString; <destuser>: WideString; <SSLMode>:Integer; <SSLVerify>:Integer; <SSLCaFile>:WideString ) :Integer

Die Worte in Klammern müssen dabei ersetzt werden:

<server>
<user>
<pass>
<destuser>
<filter>
<LeaveOnServer>
siehe Befehl "HamFetchMail" in der Hilfe
<port> Der Port, auf dem man den SSL-Server erreichen kann. Das ist nur dann noch "pop3", wenn der Server TLS unterstützt, ansonsten normalerweise 995.
<SSLMode> Wie soll SSL verwendet werden?
0 - SSL abgeschaltet
1 - SSL auf separatem Port
2 - TLS, wenn möglich
3 - TLS wird erzwungen
<SSLVerify> Steuert die Zertifikatsüberprüfung
0 - Zertifikatsüberprüfung abgeschaltet
1 - Das Zertifikat der CA und die Signatur des Serverzertifikats werden überprüft, falls ein Zertifikat vorgelegt wird.
2 - Das Zertifikat der CA und die Signatur des Serverzertifikats werden immer überprüft.
3 - Zusätzlich zur Überprüfung des Zertifikats der CA und der Signatur des Serverzertifikats wird noch das Serverzertifikat mit einer lokalen Kopie verglichen.
<SSLCaFile> Der Pfad zum Zertifikat für die Überprüfung. Wenn leer, wird der im Menü eingestellte Standard genommen. Siehe dazu auch Frage 7).


Beispiel:

Hamster-Skript:

#!hs2
HamFetchMail( "pop3-server", "995", "", "", "admin", "", 0, 1, 3, "" )

oder mit TLS:
#!hs2
HamFetchMail( "pop3-server", "110", "", "", "admin", "", 0, 3, 3, "" )

VBScript:
Set Hamster = Wscript.CreateObject( "Hamster.App" )
ControlRunFetchMailTLS( "pop3-server", "995", "", "", "admin", "", 1, 3, "" )
Wscript.DisconnectObject Hamster

oder mit TLS:
Set Hamster = Wscript.CreateObject( "Hamster.App" )
ControlRunFetchMailTLS( "pop3-server", "110", "", "", "admin", "", 3, 3, "" )
Wscript.DisconnectObject Hamster



Damit werden Mails aus einem Postfach auf dem Server pop3-server über SSL abgeholt. Das Serverzertifikat wird überprüft, es liegt im Standardpfad.

Das wär's. Vergiss aber nicht, falls vorhanden, den Befehl zum Mailholen vom selben Server, aber nicht über SSL, zu löschen oder auszukommentieren. Das ist sonst ein Sicherheitsrisiko, da zusätzlich noch eine unverschlüsselte Verbindung aufgebaut wird und dein Passwort wieder unverschlüsselt übertragen wird.

1.2.3) Wenn HamSendMail / HamSendMailAuth im Skript bzw. ControlRunSendMail / ControlRunSendMailAuth per OLE verwendet wird

Ergänze den HamSendMail(Auth)-Befehl im Skript um die SSL-Parameter. Mindestens SSLMode muss bei SSL-Benutzung immer angeben werden, da der Hamster die SSL-Einstellungen, die eventuell im Menü für diesen Server gemacht wurden, nicht übernimmt. Die anderen SSL-Parameter können weggelassen werden, dann nimmt der Hamster die Standardwerte (SSLVerify = 0; SSLCaFile = "").

HamSendMail( <server>, <port>, <from-select>, <to-select>, <SSLMode>, <SSLVerify>, <SSLCaFile> )
HamSendMailAuth( <server>, <port>, <user>, <pass>, <from-select>, <to-select>, <SSLMode>, <SSLVerify>, <SSLCaFile> )

Per OLE must du jetzt den neuen Befehl ControlRunSendMailTLS statt ControlRunSendMail bzw. ControlRunSendMailAuthTLS statt ControlRunSendMailAuth verwenden.

function ControlRunSendMailTLS( <server>: WideString; <port>: WideString; <from-select>: WideString; <to-select>: WideString; <SSLMode>: Integer; <SSLVerify>: Integer; <SSLCaFile>: WideString ) : Integer
function ControlRunSendMailAuthTLS( <server>: WideString; <port>: WideString; <user>: WideString; <pass>: WideString; <from-select>: WideString; <to-select>: WideString; <SSLMode>: Integer; <SSLVerify>: Integer; <SSLCaFile>: WideString ): Integer;

Die Worte in Klammern müssen dabei ersetzt werden:

<server>
<user>
<pass>
<from-select>
<to-select>
siehe Befehl "HamSendMail" / "HamSendMailAuth" in der Hilfe
<port> Der Port, auf dem man den SSL-Server erreichen kann. Das ist nur dann noch "smtp", wenn der Server TLS unterstützt, ansonsten normalerweise 465.
<SSLMode> Wie soll SSL verwendet werden?
0 - SSL abgeschaltet
1 - SSL auf separatem Port
2 - TLS, wenn möglich
3 - TLS wird erzwungen
<SSLVerify> Steuert die Zertifikatsüberprüfung
0 - Zertifikatsüberprüfung abgeschaltet
1 - Das Zertifikat der CA und die Signatur des Serverzertifikats werden überprüft, falls ein Zertifikat vorgelegt wird.
2 - Das Zertifikat der CA und die Signatur des Serverzertifikats werden immer überprüft.
3 - Zusätzlich zur Überprüfung des Zertifikats der CA und der Signatur des Serverzertifikats wird noch das Serverzertifikat mit einer lokalen Kopie verglichen.
<SSLCaFile> Der Pfad zum Zertifikat für die Überprüfung. Wenn leer, wird der im Menü eingestellte Standard genommen. Siehe dazu auch Frage 7).


Beispiele:

Hamster-Skript:

#!hs2
HamSendMail( "smtp-server", "465", ".*", ".*", 1, 3, "" )
# oder:
# HamSendMailAuth( "smtp-server", "465", "", "", ".*", ".*", 1, 3, "" )

oder mit TLS:
#!hs2
HamSendMail( "smtp-server", "25", ".*", ".*", 3, 3, "" )
# oder:
# HamSendMailAuth( "smtp-server", "25", "", "", ".*", ".*", 3, 3, "" )

VBScript:
Set Hamster = Wscript.CreateObject( "Hamster.App" )
Hamster.ControlRunSendMailTLS( "smtp-server", "465", ".*", ".*", 1, 3, "" )
; oder:
; Hamster.ControlRunSendMailAuthTLS( "smtp-server", "465", "", "", ".*", ".*", 1, 3, "" )
Wscript.DisconnectObject Hamster

oder mit TLS:
Set Hamster = Wscript.CreateObject( "Hamster.App" )
Hamster.ControlRunSendMailTLS( "smtp-server", "25", ".*", ".*", 3, 3, "" )
; oder:
; Hamster.ControlRunSendMailAuthTLS( "smtp-server", "25", "", "", ".*", ".*", 3, 3, "" )
Wscript.DisconnectObject Hamster



Damit werden alle Mails über den smtp-server per SSL verschickt. Das Serverzertifikat wird überprüft, es liegt im Standardpfad.

Das wär's. Vergiss aber nicht, falls vorhanden, den Befehl zum Mailsenden zum selben Server, aber nicht über SSL, zu löschen oder auszukommentieren. Das ist sonst ein Sicherheitsrisiko, da zusätzlich noch eine unverschlüsselte Verbindung aufgebaut wird und dein Passwort wieder unverschlüsselt übertragen wird.

1.3) Wie kann ich meine News über eine SSL-Verbindung abholen und verschicken?

Trage alle Daten in das Menü ein, wie unter Frage 1) und 1.1) beschrieben. Wenn du alles im Menü richtig eingetragen hast (eventuellen Portwechsel von 119 auf 563 beachten) und du jetzt im Skript oder per OLE den Befehl gibst, News von diesem Server abzuholen, benutzt der Hamster automatisch SSL.

2) Hamster als SSL-Server

Um SSL mit den lokalen Servern von Hamster zu verwenden, brauchst du ein Zertifikat mit geheimem Schlüssel. Solltest du keines haben, erscheint beim Start des lokalen Servers mit aktiviertem TLS eine Warnung im Log und der Server wird ohne TLS gestartet. Die Verbindung vom Client zum Hamster wird also nicht verschlüsselt! Wie Du ein eigenes Zertifikat erzeugen kannst, wird in Frage 6) beschrieben.

Nun zur Hamster-Konfiguration:
Im Hamster unter "Einstellungen" -> "Grundeinstellungen" müssen eventuell temporär die erweiterten Einstellungen aktiviert werden und dann auf der Registerkarte "SSL" im Feld "Schlüsselpaar" die Datei, die dein eigenes Zertifikat mit dem dazugehörigen privaten Schlüssel im PEM-Format (wird beim Erstellen wie in Frage 6) beschrieben automatisch benutzt) enthält, angegeben werden. Wenn du den privaten Schlüssel mit einem Passwort geschützt hast, musst du dieses Passwort ebenfalls eingeben. Wenn du es nicht speichern lassen willst, kannst du auch "?" angeben, dann fragt der Hamster nach jedem Start einmal nach dem Passwort. Die nächsten zwei Einstellfelder sind nur interessant, wenn du Clientzertifikate benutzen willst.

Auf der Registerkarte des jeweiligen Servers unter "Einstellungen" -> "Lokale Server" einstellen, dass TLS verwendet werden soll. Wenn alle deine Clients TLS unterstützen, solltest du das Auswahlfeld auf "Erzwinge TLS" stellen, ansonsten auf "Erlaube TLS". Bei letzterem wird aber nur dann SSL (also Verschlüsselung) verwendet, wenn der Client das auch unterstützt und so konfiguriert ist!

Ab dem nächsten Start des jeweiligen Servers, also beim Starten des Hamsters oder beim Benutzen des jeweiligen Eintrags im Menü "Lokale Server", wird der Server mit SSL-Unterstützung gestartet.

Beachte bitte, dass es nicht möglich ist, Hamster als SSL-Server auf einem separaten SSL-Port zu benutzen. RfC 2595 nennt im Abschnitt 7 gute Gründe, warum eine solche Konfiguration nicht mehr verwendet werden sollte. Möchtest du SSL trotzdem über einen separaten SSL-Port verwenden, brauchst du dazu einen externen SSL-Wrapper, z.B. das Programm STunnel. STunnel muss dann an 0.0.0.0:<SSL-Port> (je nach Protokoll) gebunden werden und eingehende verschlüsselte Verbindungen an 127.0.0.1:<Port> (wenn der Hamster auf dem selben Computer läuft) weiterleiten. Das Zertifikat muss ebenfalls bei STunnel angegeben werden. Den Hamster bindest du dann an 127.0.0.1 und stellst ihn auf "Kein TLS". Zu einer ausführlichen Erklärung lies dir die Hilfe zu STunnel durch.

Beachte bitte, dass, wenn der Hamster als Server Verbindungen vom Internet annehmen soll, auf jeden Fall weitere Schutzmaßnahmen notwendig sind. In dieser Hinsicht hilft kein SSL, außer du verwendest Client-Zertifikate. Also, für _jeden_ Hamsteraccount starke Passwörter verwenden. Schalte in den Einstellungen der lokalen Server auf der Seite Mail SMTP-AUTH ein, wenn du einen Mailreader hast, der dies beherrscht. Dabei muss der Mailreader sich mit einer gültigen Username-Passwort-Kombination beim Hamster authentifizieren, bevor er Mails verschicken kann. Wenn dein Mailreader dies nicht kann, schalte SMTP-after-POP3 ein. Dabei muss der Mailreader vor dem Mailverschicken, Mails abholen. Wenn du keines von beiden machst, kann jeder, ohne ein Passwort kennen zu müssen, Spam über deinen Rechner verschicken. Erstelle auch einen Benutzer mit Usernamen "nntpdefault" und Passwort "*". Dieser Benutzer wird immer dann verwendet, wenn der Client keinen Benutzernamen und kein Passwort beim lokalen Newsserver angibt. In den Einstellungen dieses Benutzers darf dann in keinem Eingabefeld mit weißem Hintergrund außer "voller Name" irgendetwas stehen und der Benutzer darf keine Mailbox haben, so dass dieser Benutzer (und damit auch ein eventueller Spammer oder Angreifer ohne Benutzernamen und Passwort) gar nichts machen kann. Es wäre zwar nicht unbedingt notwendig, diesen Benutzer einzurichten, da sich der Hamster ohne diesen ebenso verhält, aber ich empfehle es trotzdem, damit nicht später einmal dieser Benutzer mit Berechtigungen eingerichtet wird und dabei eine große Sicherheitslücke entsteht.

Zur Einrichtung von Client-Zertifikaten siehe Frage 8.2.1).

3) Wie erhöhe ich die Sicherheit bei SSL?

Für eine SSL-Verbindung braucht OpenSSL und damit der Hamster, denn der benutzt die OpenSSL-Biliotheken, möglichst zufällige Zufallsdaten. Dazu wird automatisch die Datei "randseed.!!!" im Hamsterverzeichnis angelegt, in der die Zufallsdaten aus dem internen Pseudozufallszahlengenerator (PRNG) von OpenSSL gespeichert werden. Wenn Du eine Quelle guter Zufallsdaten hast, die du stattdessen verwenden möchtest, kannst Du unter "Einstellungen" -> "Grundeinstellungen" auf der Registerkarte "SSL" im Feld "Externe Datei mit Zufallsdaten für PRNG" eine andere Datei angeben, aus der Zufallsdaten gelesen werden. Bitte beachte dabei, dass Hamster in die Datei "randseed.!!!" nach jeder Benutzung neue Zufallsdaten schreibt, nicht aber in die zusätzlich angegebene Datei.

Vielleicht solltest du auch mal über Server- und Client-Zertifikate nachdenken.

4) Was sind Zertifikate und wozu brauche ich sie?

Zertifikate kann man vielleicht mit einem Pass vergleichen. Du zeigst es / ihn vor, wenn du willst, dass andere sich darauf verlassen können, dass du wirklich der bist, der du zu sein vorgibst. Dafür bürgt jemand, dem du traust: eine Certificate Authority (CA) oder der Staat. Du kannst zwar nicht wie bei einem Pass mit dem Bild prüfen, ob das Zertifikat wirklich dem gehört, der es benutzen will, aber das macht nichts, da der andere ohne den zum öffentlichen Schlüssel (= Zertifikat) passenden geheimen Schlüssel oder eine sehr, sehr große Rechenpower nichts entschlüsseln kann, was du an den Inhaber des Zertifikats schickst.

Self-Signed Zertifikate musst du dir vorstellen wie den Pass eines Königs: Der Austellende (hier: der Staat = König) bürgt für sich selbst. Du brauchst also Zertifikate, wenn du sichergehen willst, dass der, mit dem du sprichst, wirklich der ist, mit dem du sprechen willst und nicht irgendein x-beliebiger Betrüger. Technisch gesehen ist ein Zertifikat ein öffentlicher RSA-Schlüssel. Weil im Normalfall nur der richtige Server den dazu passenden privaten Schlüssel hat, weißt du, wenn der Server deine Texte richtig entschlüsseln kann, ist es der richtige.

Voraussetzung dafür ist natürlich, dass du das richtige Zertifikat (= öffentlicher Schlüssel) hast. Wenn du dir dieses über das Internet holst, wie in Frage 5) beschrieben, kannst du dir dessen erst mal _nicht_ sicher sein! Eine Möglichkeit, eine größere Gewissheit zu bekommen, sind Signaturen. Nehmen wir an, es hat schon mal jemand (z.B. eine Certificate Authority = CA) überprüft, ob dieses Zertifikat echt ist, und dann das Zertifikat signiert. Wenn du jetzt den (garantiert) richtigen öffentlichen Schlüssel von diesem Jemand besitzt und diesem vertraust, dass er z.B. keine gefälschten Zertifikate signiert, kannst du dir auch über das Zertifikat sicher sein.

Nochmal eine Zusammenfassung: Ein Zertifikat ist normalerweise dazu da, dass man sich sicher sein kann, mit wem man spricht. Dies ist z.B. beim Serverzertifikat der Fall. Ein Zertifikat einer CA ist dazu da, die Richtigkeit eines anderen Zertifikats zu bestätigen. Ein Self-Signed Zertifikat ist ein beliebiges Zertifikat, dessen Richtigkeit nur vom Aussteller bestätigt wird, nicht noch zusätzlich von jemand anderem. Wenn man ein solches bekommt, muss man dieses Zertifikat also genau prüfen, während es normalerweise ausreicht, das Zertifikat der CA zu überprüfen, weil diese ja schon das Serverzertifikat überprüft hat.

5) Wo bekomme ich fremde Zertifikate her?

5.1) CA-Zertifikate

Wenn du schon weißt, welche CA das Serverzertifikat signiert hat, kannst du die nächsten Schritte überspringen. Ansonsten brauchst du das Serverzertifikat und OpenSSL.exe, um das herauszufinden. Rufe OpenSSL.exe mit folgender Befehlszeile auf:

openssl x509 -issuer -noout -in <Serverzertifikat.pem>

Die Ausgabe sollte dann den Namen der CA enthalten. Eine Gesamtübersicht über das Zertifikat erhälst du mit:

OpenSSL x509 -text -noout -in <Serverzertifikat.pem>

Wenn du den Namen der CA hast, brauchst du noch deren Zertifikat. Meistens bekommst du es auf deren Website. Oft sind sie auch bei einem Browser mitgeliefert. Wenn du dem Browserhersteller vertraust und dir sicher bist, dass du wirklich die Originalversion des Browsers hast, kannst du sie auch von dort exportieren. Die beim Internet Explorer mitgelieferten Zertifikate siehst du unter "Systemsteuerung" / "Internetoptionen" / Registerkarte "Inhalte" / Button "Zertifikate". Beim Exportieren des Zertifikats muss das Format "Base64-kodiertes X509" gewählt werden. Der Dateiname ist egal, der Übersichtlichkeit halber empfehle ich aber die Endung ".pem". In Opera 7 findest du die Zertifikate im Menü "File" / "Preferences" / Abschnitt "Security" / Bereich "Certificates" / "Authorities". Beim Exportieren muss das Format "PEM file (*.pem)" ausgewählt werden. Frühere Versionen von Opera unterstützen dieses Format nicht, dann muss das Zertifikat mit Hilfe der OpenSSL.exe aus dem CER-Format in das PEM-Format gewandelt werden.

Beachte jedoch unbedingt, dass du dir der Echtheit der Zertifikate so nicht sicher sein kannst. Du solltest daher unbedingt den Fingerprint des Zertifikats, den dir OpenSSL mit dem Parameter "x509 -info" anzeigt, überprüfen. Das kann z.B. per Telefon geschehen oder du besuchst ein Büro der jeweiligen Firma.

5.2) Serverzertifikate

Manchmal findest du das Serverzertifikat auf der Website des Serverbetreibers oder du holst es dir mit der OpenSSL.exe direkt vom Server.

Wenn der Server SSL auf einem separaten Port unterstützt, starte OpenSSL, während eine Onlineverbindung besteht, mit dieser Kommandozeile:

openssl s_client -connect <Server>:<Port> > OpenSSL.log

Für <Server>:<Port> gib die Adresse des SSL-Servers an, dessen Zertifikat du bekommen willst.

Bei einem SMTP-Server, der TLS unterstützt, bekommst du das Zertifikat so:

openssl s_client -connect <Server>:<Port> -starttls smtp > OpenSSL.log

Leider unterstützt der "-starttls"-Parameter zur Zeit nur SMTP. Bei einem anderen Protokoll musst du daher zuerst eine Klartextverbindung aufbauen und die Verschlüsselung händisch starten. Von Martin Germann gibt es das Programm SSL-Tool, das genau das für die Protokolle SMTP, POP3, NNTP und IMAP automatisch macht.

Auch bei Verwendung dieses Programms benötigst du OpenSSL. Starte das Programm, trage die Daten des Servers unter "Remote" und einen freien lokalen Port unter "local" ein, und starte den Wrapper mit einem Klick auf "Start Wrapper". Jetzt verbinde dich mit OpenSSL auf den lokalen Port, den du angegeben hast:

openssl s_client -connect localhost:<Port> > OpenSSL.log

Das Programm handelt daraufhin eine TLS-Verbindung mit dem angegebenen Server aus und tunnelt dann die Verbindung zu OpenSSL.

Öffne anschließend die Datei OpenSSL.log im OpenSSL-Verzeichnis mit einem beliebigen Texteditor und kopiere alles von einschließlich der Zeile

-----BEGIN CERTIFICATE-----

bis zu einschließlich der Zeile

-----END CERTIFICATE-----

in eine neue Datei. Gib dieser Datei einen möglichst aussagekräftigen Namen. Ich empfehle, der Übersichtlichkeit halber für alle Zertifikatsdateien mit diesem Format die Endung .pem zu nehmen. OpenSSL.log kannst du jetzt löschen.

Genau wie beim CA-Zertifikat kannst du dir jedoch so _nicht_ sicher sein, dass du das richtige Zertifikat hast. Du kannst jedoch die Signatur mit dem CA-Zertifikat überprüfen, oder du prüfst wieder den Fingerprint über andere Kanäle wie Telefon oder persönliches Erscheinen.

6) Wie erstelle ich mir ein eigenes Zertifikat?

Als erstes ein kurzer Hinweis: Du benötigst meist kein eigenes Zertifikat, wenn du nur SSL-Verbindungen zu einem fremden Server, wie Web.de oder GMX aufbauen willst, da diese meistens keine Clientzertifikate unterstützen.

Zum Zertifikat-Erstellen benötigst du die OpenSSL.exe und die 2 Dateien "MakeCert.bat" und "cert.cnf" von Martin Germann.

Kopiere die beiden Dateien aus dem Ziparchiv in das Verzeichnis von OpenSSL.exe, führe MakeCert.bat aus und folge den Anweisungen. Das Passwort sollte allerdings wegen möglichen Kompatibilitätsproblemen keine Umlaute und Sonderzeichen enthalten. Der öffentliche Schlüssel (= Zertikat) und ein dazugehöriger privater RSA-Schlüssel befindet sich dann in der Datei certificate.pem im OpenSSL-Verzeichnis.

Das Zertifikat alleine kann bedenkenlos weitergegeben werden, aber der RSA-Schlüssel nicht! Wenn ein Angreifer beides hat, kann er so tun, als wäre er du und die ganzen Zertifikate wären wirkungslos. Also auf keinen Fall die Zeilen

-----BEGIN RSA PRIVATE KEY-----
...
----END RSA PRIVATE KEY-----
weitergeben. Auf dem lokalen Computer müssen sie natürlich trotzdem vorhanden sein.

Achtung!
Der RSA-Schlüssel darf nur auf dem Computer sein, der sich mit diesem Zertifikat authentifizieren soll, also auf dem Server bei Verwendung von Serverzertifikaten und auf dem Client bei Verwendung von Clientzertifikaten. Gib ihn deshalb nicht weiter! Gelangt der Schlüssel und das Zertifikat in fremde Hände, kann der Dritte ohne irgendein Problem so tun, als wäre er du! Der ganze Sinn von Zertifikaten wäre also hinfällig.

Zum Einbinden des Zertifikates in den Hamster siehe Frage 8.1.1) (als Serverzertifikat) oder Frage 8.2.2) (als Clientzertifikat).

7) Wie mache ich dem Hamster fremde Zertifikate bekannt?

Beide hier beschriebenen Methoden sind technisch gleichwertig. Die Auswahl bleibt daher dem Anwender überlassen.

Grundsätzlich gilt, dass, wenn in den Servereinstellungen oder im Skript keine Angaben gemacht werden, die Standardpfade aus den entsprechenden Feldern auf der Registerkarte SSL in den Grundeinstellungen des Hamsters übernommen werden. In den Grundeinstellungen darf im Feld "Datei mit Zertifikaten zwecks Überprüfung" nur eine einzelne Datei und im Feld "Pfad mit Zertifikaten zwecks Überprüfung" nur ein Verzeichnis stehen. Das nicht benutzte Feld kann leergelassen werden. In dem Feld im Servermenü oder im Parameter <SSLCaFile> im Skript kann entweder eine einzelne Datei oder ein ganzes Verzeichnis angegeben werden.

7.1) Alle Zertifikate in einer Datei

Bei nur einem oder wenigen Zertifikaten ist es am einfachsten, diese alle in eine Datei zu kopieren. Diese sieht dann z.B. so aus:

-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Der Dateiname und der Ort der Datei ist egal, ich empfehle aber, der Übersichtlichkeit halber einen möglichst aussagekräftigen Namen mit der Endung .pem zu nehmen. Außer den Zertifikaten kann auch noch anderer Text in der Datei stehen, aber nur außerhalb der Zeilen
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----
Um möglichen Problemen aus dem Weg zu gehen, sollte der eigene Text auch nur aus ASCII-Zeichen bestehen, d.h. keine Umlaute usw. enthalten.

Im Hamster wird dann an der entsprechenden Stelle der Name der Datei inklusive komplettem Pfad angegeben.

7.2) Alle Zertifikate in einem Verzeichnis

Mit vielen Zertifikaten kann eine Datei leicht unübersichtlich werden. Dann empfiehlt sich diese Methode. Alle Zertifikate stehen jeweils einzeln in einer Datei. Damit der Hamster sie findet, müssen sie im gleichen Verzeichnis liegen und ein bestimmtes Dateinamensformat haben, nämlich <Hash-des-Zertifikats>.0. Von Martin Germann gibt es das Skript SSL-Cert-Hash, das mit Hilfe der OpenSSL.exe allen Zertifikaten in einem Verzeichnis, die in .pem-Dateien vorliegen, automatisch den richtigen Dateinamen gibt.

Im Hamster wird dann nur der Pfad zu diesem Verzeichnis angegeben. Natürlich funktioniert diese Methode auch dann, wenn du nur ein Zertifikat hast.

8) Wie benutze ich Zertifikate mit Hamster und SSL?

Mit Serverzertifikaten stellt der Client sicher, dass er mit dem richtigen Server spricht. Das wird z.B. dann verwendet, wenn der Hamster einen fremden Server abfragen soll oder als TLS-Server mit einem Zertifikat versehen werden soll. Clientzertifikate werden verwendet, wenn der Server sicherstellen will, dass er mit dem richtigen Client spricht (also das, wozu normalerweise Benutzername und Passwort verwendet werden). Das wird von externen Servern leider selten unterstützt.

Du kannst natürlich auch ohne Probleme Serverzertifikate und Clientzertifikat gleichzeitig verwenden.

8.1) Serverzertifikate

8.1.1) Einrichten mit dem Hamster als Server

Wie du ein eigenes Zertifikat erstellen kannst, steht in Frage 6). Eingebunden wird es, indem du den Dateinamen bei temporär aktivierten erweiterten Einstellungen in den Grundeinstellungen auf der Registerkarte SSL in der ersten Box eingibst. Außerdem musst du eventuell noch das Passwort angeben. Dann authentifiziert sich der Hamster dem Client gegenüber automatisch.

8.1.2) Einrichten mit dem Hamster als Client

Dabei gibt es zwei Stufen. Die erste Stufe überprüft nur das Zertifikat der CA und die Signatur dieser CA auf dem Serverzertifikat. Das Serverzertifikat selber wird nicht überprüft. Wenn du der CA vertraust, reicht das normalerweise aus. Wenn du allerdings der CA nicht vertraust, solltest du unbedingt die zweite Stufe nutzen, dabei ist das Vertrauen in die CA nicht mehr so wichtig. Du solltest dann aber das Serverzertifikat besonders genau überprüfen, auf jeden Fall auch durch einen Kanal außerhalb des Internets. Die zweite Stufe baut auf der ersten auf und überprüft zusätzlich noch das Serverzertifikat selber. Wie du ein Zertifikat von einer CA oder von einem externen Server bekommst, steht in Frage 5).

8.1.2.1) Überprüfen des CA-Zertifikates

Wenn du nun das Zertifikat der CA hast, sagst du dem Hamster, dass er es beim Aufbau der Verbindung überprüfen soll. Dazu setzt du im Skript den Parameter <SSLVerify> auf 2 oder im Menü die Auswahlbox "Wähle Überprüfungsverfahren" auf "Zertifikate immer überprüfen". Was du in das Feld "Überprüfung über Datei" eingeben musst, ist in Frage 7) erklärt.

8.1.2.2) Überprüfen des Serverzertifikats per lokaler Kopie

Im Skript setzt du nun im Skript den Parameter <SSLVerify> auf 3 oder im Menü die Auswahlbox "Wähle Überprüfungsverfahren" auf "Peer mittels lokal vorhandener Zertifikate ueberprüfen". Was du in das Feld "Überprüfung über Datei" eingeben musst, steht in Frage 7). Beachte aber, dass du dem Hamster jetzt zwei Zertifikate (das Server- und das CA-Zertifikat) auf einmal bekannt machen musst.

8.2) Clientzertifikate

8.2.1) Einrichten mit dem Hamster als Server

Du benötigst auf dem Server das Zertifikat des Clienten (nicht jedoch deren private Schlüssel!), der sich beim Server authentifizieren soll. Außerdem muss der Hamster wie in Frage 2) beschrieben vollständig für den Betrieb als TLS-Server eingerichtet sein.

In den Grundeinstellungen auf der Registerkarte SSL aktivierst du eventuell temporär die erweiterten Einstellungen und gibst entweder bei "Datei mit Zertifikaten zwecks Überprüfung" eine Datei an, die alle Zertifikate gesammelt enthält oder bei "Pfad mit Zertifikaten zwecks Überprüfung" ein Verzeichnis, in dem alle Zertifikate in Einzeldateien liegen. Siehe dazu auch Frage 7).

Jetzt kann der Hamster zwar die Zertifikate vergleichen, aber er fängt mit dem Ergebnis noch nichts an. Damit der Hamster nur Verbindungen mit gültigem Clientzertifikat akzeptiert, musst du in der Hamster.Ini im Abschnitt [SSL] den Eintrag VerifyLevel auf 2 oder 3 stellen.

8.2.2) Einrichten mit dem Hamster als Client

Wie du ein eigenes Zertifikat erstellen kannst, steht in Frage 6). Eingebunden wird es, indem du den Dateinamen bei temporär aktivierten erweiterten Einstellungen in den Grundeinstellungen auf der Registerkarte SSL in der ersten Box eingibst. Außerdem musst du eventuell noch das Passwort angeben.

9) Was bedeuten diese Fehlermeldungen?

[...] Verify error: unable to get local issuer certificate depth=0 [...]
[...] OpenSSL error: SSL_connect: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Wenn diese Fehlermeldungen auftauchen, ist höchstwahrscheinlich "Zertifikate überprüfen" eingestellt (oder der Parameter <SSLVerify> auf > 0 gesetzt), aber der Hamster kann das Zertifikat der CA nicht finden. Stelle sicher, dass du es hast, dass es im richtigen Format vorliegt und dass alle Pfade stimmen. Wenn du keine Möglichkeit hast, das Zertifikat der CA zu bekommen, musst du die Zertifikatsüberprüfung leider ausschalten.

[...] OpenSSL error: SSL_CTX_new: error:140A90A1:SSL routines:SSL_CTX_new:library has no ciphers
[...] Creating SSL context failed
Hier konnte OpenSSL nicht initialisiert werden. Wahrscheinlich ist es ein Speicherproblem. Prüfe, ob du mehrere SSL-Verbindungen gleichzeitig aufbaust (auch mehrere Threads zu einem Newsserver sind verschiedene Verbindungen!) und stelle auf weniger bis eine gleichzeitige SSL-Verbindung um.

10) Wo bekomme ich OpenSSL her?

Den OpenSSL-Sourcecode gibt es auf http://www.openssl.org/.

Eine Anleitung zum Kompilieren unter Windows gibt es von Martin Germann unter http://sites.inka.de/ximera/hamster.html#openssl-kompilieren.

Prinzipiell solltest du OpenSSL selber kompilieren, denn nur so kannst du sicher sein, dass derjenige, von dem das Binary kommt, keine Schadfunktion oder einen Trojaner eingefügt hat. Für diejenigen, die sich OpenSSL nicht selber kompilieren können, gibt es ebenfalls von Martin Germann fertig kompilierte Windows-Binaries.

Direkte Links, die immer zur gerade aktuellen Version führen:

OpenSSL-DLLs und dazugehörige PGP-Signatur
OpenSSL.exe inklusive Anleitung und dazugehörige PGP-Signatur

11) Was für interessante URLs gibt es zu diesem Thema?

Als erstes nochmal die Download-URLs:



URLs zum Einlesen:



Newgroups:



--

Philipp Wendler philippwendler@web.de

Version: 3.5
letzte Änderung: 16.09.2003