2012-04-11 8 views
1

Ich habe ein Problem mit Zwei-Wege-Authentifizierung. Ich benutze tomcat6 als Server und als Client versuche ich IE, Firefox und meine eigene Java-Anwendung.Zwei-Wege-Autorisierung mit PFX-Datei

Das Problem tritt unter Verwendung von PFX-Zertifikaten auf, die mir von jemand anderem gegeben wurden. Ich muss sie als ein Client-Zertifikat verwenden, also ich es nur zu vertrauenswürdigen Zertifikaten auf dem Server hinzufügen und es im Browser in Benutzerzertifikaten verwenden. Das Problem ist, dass ich den Alarm "bad_certificate" bekomme.

ich tun Zwei-Wege-ssl meine eigenen Zertifikate für Server und Client durch das Erzeugen und Hinzufügen von öffentlichen Schlüsseln in den beiden Schlüsselspeicher usw. als vertrauenswürdig gelungen ...

Wenn ich wireshark logs ich sehe beobachten, dass Server sendet gute Zertifikatanforderung, aber Client sendet leeres Zertifikat (Paket mit 11 Byte Länge) anstelle von 500+ Byte, wenn ich mein eigenes generiertes Zertifikat verwendet habe.

Was kann das Problem sein? Warum sendet der Kunde kein gutes Zertifikat? :(

+0

Sie haben Ihren Server bereits für die Client-Authentifizierung eingerichtet, Sie sagen: Welche Art von Keystore hatten Sie für Ihren Connector? – Cratylus

+0

Jks, ich glaube nicht, dass es das Problem gibt, weil es mit meinem eigenen generierten Schlüssel funktioniert, und arbeitet mit openssl s_client mit pfx Schlüssel. Funktioniert nur nicht mit pfx mit firefox, dh (mit Schlüssel im Windows-Store) oder Java-App zeigt auf p12 Keystore – Deo

+0

Die Art, wie Sie es beschreiben, ist die pfx leer oder beschädigt. Haben Sie versucht, seinen Inhalt zu sehen? – Cratylus

Antwort

2

Nun, die erste Sache zu prüfen ist, ob Tomcat korrekt konfiguriert ist, um ein Zertifikat vom Client für den fraglichen Pfad anzufordern. Für Tomcat 6 bedeutet dies, dass Sie einen Connector in conf/server konfiguriert haben sollten .xml etwas wie folgt aus:

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" 
      maxThreads="150" scheme="https" secure="true" 
      keystoreFile="${user.home}/.keystore" keystorePass="password" 
      truststoreFile="conf/truststore" truststorePass="password" 
      clientAuth="true" sslProtocol="TLS" /> 

Die truststoreFile & truststorePass wichtig sind - wenn man nur hinzufügen „ClientAuth = true“ ohne diese beiden Parameter einschließlich, finden Sie alle Arten von seltsamen Verhalten sehen (und keine Warnung, dass Sie hat etwas falsch gemacht.) Das truststoreFile muss auf eine legitime JKS-Datei zeigen, die die CAs auflistet, denen Sie vertrauen, dass sie die Client-Zertifikate signieren. Wenn Tomcat korrekt konfiguriert ist, sollte der Browser Öffnen Sie den Dialog wie folgt: "Die Website benötigt ein Client-Zertifikat" sowie eine Liste aller Zertifikate, die in den Browser importiert wurden. Wenn Sie dies nicht sehen, ist etwas mit Ihrem Tomcat-Setup nicht in Ordnung.

Es klingt, als ob Sie das richtig eingerichtet haben, aber es lohnt sich, es nochmals zu überprüfen. Wenn Sie es ordnungsgemäß eingerichtet haben, sehen Sie außerdem eine Handshake-Nachricht "Zertifikatsanforderung", wenn Sie die Verbindung in Wireshark nachverfolgen, die die vertrauenswürdigen CAs nach Distinguished Name auflistet. Wenn Sie dies nicht sehen, überprüfen Sie Ihr Tomcat-Setup und vor allem den Truststore.

Die nächste Sache wäre, die PKCS12-Datei selbst zu überprüfen. Sie können dies tun mit:

openssl pkcs12 -in [path-to-pkcs12-file] -nokeys | openssl x509 -noout -subject -issuer 

sicherstellen, dass der Distinguished Name eines der Emittent der trustedCaCert Einträge in Ihrem Vertrauensspeicher passt. Dies ist eine Art von Ärger mit dem Java keytool zu tun, aber Sie können verdoppeln Prüfung mit:

keytool -exportcert -keystore conf/truststore -alias [alias of trusted cert] | openssl x509 -noout -subject -inform der 

Wenn all dies überprüft, aber es funktioniert immer noch nicht, es lohnt sich OpenSSL s_client verwenden, da Sie zu beheben, Normalerweise erhalten Sie viel mehr Informationen zur Fehlerbehebung. Um dies zu tun, werden Sie den Schlüssel aus dem Zertifikat in der PKCS12-Datei trennen müssen:

openssl pkcs12 -in [PKCS12 file] -out [whatever].key 
openssl s_client -tls1 -connect localhost:443 -cert [whatever].key -key [whatever].key 

(Sie können die gleiche Datei für das „-cert“ verwenden und „-Taste“ Argument, weil openssl smart genug nach den Trennzeichen "BEGIN CERTIFICATE" und "BEGIN RSA PRIVATE KEY" in den Quelldateien suchen. Ich hatte ein frustrierendes Problem mit Client-Zertifikaten, das ich nicht einmal herausfinden konnte, bis ich s_client verwendete und eine Erinnerung erhielt, dass mein Client-Zertifikat abgelaufen war (das nicht protokolliert oder irgendwo anders ausgegeben wurde).

Auch möchten Sie vielleicht in Erwägung ziehen, Ihre Konfiguration Verschiebung Apache Tomcat über die Verwendung - Apache ist ein viel flexibler und gibt Ihnen eine viel mehr Feedback, wenn es um SSL confifguration kommt als Tomcat ist.

+0

Dank, Ich habe alle gut eingerichtet, aber trotzdem danke für das Anzeigen der richtigen Stecker Konfiguration noch einmal :) Ich werde überprüfen, dass s_client Sache morgen früh, bereit für Feedback sein. – Deo

+0

Ich habe erfolgreich eine sichere Verbindung mit openssl s_client hergestellt. Warum kann ich es nicht über Firefox tun? (wenn ich ein Zertifikat zu Firefox hinzufüge, zeige ich auf pfx-Datei, scheint er nur pkcs12 Dateien zu akzeptieren) Die einzigen Fehler, die s_client zeigt, sind 18 (selbstsigniertes cert), was absolut in Ordnung ist, denn Serverzertifikat ist in der Tat selbstsigniert. Wie auch immer, er hatte keine Probleme in GET /, und beim Betrachten von Wireshark Protokollen ging alles gut ... Warum ist Firefox und Internet Explorer mit der gleichen PFX-Datei Probleme? Ich versuche nicht einmal, meine Java-App einzuschalten, weil sie noch weniger zuverlässig ist. – Deo

+0

Zertifikat, das nur auf open_ssl funktioniert ist lang (über 1800bytes) Zertifikat, das überall funktioniert ist kurz (ungefähr 750bytes) und wieder: die einzige Kommunikation ist bad_certificate (wegen des leeren Zertifikat TLS-Pakets) – Deo

2

Sehen Sie sich genauer Ihre Client-Zertifikate an, insbesondere die X509v3-Erweiterungen "Key Usage" und "Extended Key Usage". Sie können als nicht vertrauenswürdig für die Client-Authentifizierung markiert sein.

Verwenden der openssl command-line tool:

$ openssl pkcs12 -in server-only.pfx -nokeys | openssl x509 -noout -purpose 
Enter Import Password: 
MAC verified OK 
Certificate purposes: 
SSL client : No 
SSL client CA : No 
SSL server : Yes 
SSL server CA : No 

Dieses Zertifikat nur für die Server-Authentifizierung (normal HTTPS) signiert ist. Für weitere Informationen, verwenden Sie die Option -Text in openssl x509:

$ openssl pkcs12 -in server-only.pfx -nokeys | openssl x509 -noout -text 
    [..snip..] 
     X509v3 Key Usage: 
      Digital Signature, Key Encipherment 
     X509v3 Extended Key Usage: 
      TLS Web Server Authentication 
    [..snip..] 

Wenn dies der Fall ist, Sie gehen zu müssen, bitten, ein neues signiertes Zertifikat zu erhalten, die für die Client-Authentifizierung verwenden markiert ist.