2009-10-30 4 views
8

Zusammenfassung: Wie installiere ich ein neues Stammzertifikat mit Java-Code in Java?Wie importiere ich ein neues Java-CA-Zertifikat, ohne das Befehlszeilenprogramm keytool zu verwenden?

Wir haben eine Desktop-Anwendung, die auf verschiedene Web-Services zugreift. Kürzlich hat einer von ihnen sein SSL-Zertifikat auf einen von Trustwave signierten umgestellt. Während die Trust SSL-Zertifikate durch regelmäßigen Internet-Browser akzeptiert werden, Java scheint nicht mit der Voraussetzung Root-Zertifikaten zu kommen, und wir verloren den Zugang zu dem angegebenen Web-Service mit der folgenden Fehlermeldung:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

haben wir ein temporären raten Sie dazu, den Anbieter davon zu überzeugen, zu Verisign zurückzukehren, aber wenn er zurückwechselt, müssen wir bereit sein. Also brauche ich unsere Desktop-Software, um das Trustwave-Root-Zertifikat nach Bedarf automatisch zu installieren. Unsere Kunden sind nicht technisch versiert genug, um den keytool-Befehl zu verwenden, und ich würde sie lieber nicht skripten, da dies für mich eine zerbrechliche Lösung ist (separate Implementierungen für Mac und PC, der Kampf gegen Vista-Ausführungsbeschränkungen, Probleme beim Finden der richtigen JRE) , etc).

Ich stelle mir vor, das Keytool verwendet intern Java. Welchen Befehl könnte ich innerhalb von Java verwenden, um die Funktionalität von keytool zu replizieren und das Root-Zertifikat programmatisch zu installieren?

Antwort

2

Ich weiß nicht, ob das möglich ist, aber Sie könnten Ihren eigenen TrustManager implementieren, um diese Verbindung oder diese CA zu ermöglichen. Here sind die Grundlagen.

+0

Das könnte für uns arbeiten. Der Link schlägt eine Möglichkeit vor, die Verifizierung vollständig zu deaktivieren, was nicht genau das ist, was wir wollen, aber vielleicht könnte ich den normalen TrustManager untergehen, um einen zu erstellen, der alle regulären Stammzertifikate plus eins ausprobiert. Danke, das sieht vielversprechend aus. –

0

Wenn Sie das Zertifikat im Keystore des vertrauenswürdigen Stamms auf dem Desktopcomputer installieren möchten, benötigen Sie dazu die entsprechende Berechtigung. Es ist das gleiche mit dem keytool, Sie benötigen ein Passwort für den Zugriff auf den Keystore des vertrauenswürdigen Root. Wenn Sie schnell-n-dirty sein wollen, können Sie

  • schreiben das Zertifikat in einer Datei oder einem Byte-Stream oder was auch immer
  • Import mit KeyTool Klasse (sun.security.tools.KeyTool)

Aber IMHO wenn das Zertifikat ist nicht gültig, dann ist es nicht vertrauenswürdig. Ich würde sagen, dass es einen guten Grund dafür gibt.

+0

Es gilt nach Firefox und Internet Explorer. Java kommt nur mit seinem eigenen Schlüsselspeicher, anstatt das Betriebssystem zu verwenden, das zur Verfügung gestellt wird, und ich nehme an, dass die Java-Version die letzten Ecken zum SSL-Markt nicht einschließt. –

+0

Es gibt Fälle, in denen dies zumutbar ist: In unserem Unternehmen verwenden wir intern eine eigene CA - natürlich ist sie standardmäßig nicht vertrauenswürdig (Browser etc.). Das Importieren dieses CA-Zertifikats ist viel einfacher als das Hinzufügen von Ausnahmen für einzelne Zertifikate überall. – sfussenegger

1

IMHO hat Sun keytool nicht über eine API verfügbar gemacht, hauptsächlich um zu verhindern, dass Entwickler die Gruppe der vertrauenswürdigen CAs ändern. Ich kann mir sehr gut vorstellen, dass Angreifer diesen Code ausnutzen, um ihre eigenen Root-Zertifikate in den Trust Store zu integrieren, wodurch das Modell des Truststores kompromittiert wird.

In der Tat, wenn Sie die Quelle der KeyTool-Klasse (sun.security.tools Paket) betrachten, ist es nicht nur endgültig, es hat auch einen privaten Konstruktor, der verhindert, dass jeder Aufrufer eine Instanz der KeyTool-Klasse erstellen kann Code. KeyTool verfügt über eine Hauptmethode, die die Befehlszeile (und damit einen Betriebssystembenutzer) möglicherweise zur einzigen Möglichkeit macht, mit KeyTool zu initialisieren und zu kommunizieren.

Die einzige (simpel) Ansätze verlassen würde:

  • initialisieren keytool als Prozess der Anwendung und Kommandozeilen-Argumente übergeben das Root-CA-Zertifikat zu installieren. Dies allein ist eine schlechte Idee, und ich würde empfehlen, den Benutzer darüber zu informieren, was vorkommt.
  • Vermeiden Sie die Verwendung von Keytool, und geben Sie stattdessen den Benutzern Anweisungen zur Installation der Stammzertifizierungsstelle unter Verwendung von Keyman oder KeyTool IUI. Nur für mich selbst, bevorzuge ich Letzteres.
+1

Für die technische Ebene unserer Benutzer ist die automatische Installation ohne Fragen die einzige Option, die uns vor "Ihrer Anwendung ist kaputt, reparieren Sie es" Art von Support-Fragen. –

+0

Zur philosophischen Frage, ob Anwendungen den Keystore modifizieren dürfen, muss die Antwort natürlich sein - sonst könnte das Keytool selbst nicht funktionieren. Der Zugriff auf die Operation könnte möglicherweise von einem Sicherheitsmanager gesteuert werden. Ach, ich schweife ab. Die Design-Entscheidungen sind dabei nicht so wichtig wie die Suche nach einer praktischen Lösung. Danke für die Hinweise in beide Richtungen. –

+3

Ich hatte vergessen, eine andere Alternative zu erwähnen - mit Ihrem eigenen Trust Store, der alle gewünschten Stammzertifizierungsstellen enthalten könnte. Sie können die JVM dazu veranlassen, diesen Truststore über die Eigenschaft javax.net.ssl.trustStore zu verwenden. –

1

Sie könnten KeyTool immer als Prozess aufrufen.

0

Command-line solution. Auf dem Mac ist das Java-Home/Library/Java/Home. Versuchen:

$ sudo -i 
# cd /Library/Java/Home 
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts 

Ersatz CAName mit dem Namen Ihrer CA und ca.crt mit einem Pfad zur Zertifikatsdatei (PEM funktioniert). Es wird nach einem Schlüsselspeicherkennwort gefragt. Das Standardkennwort wird im verknüpften Artikel angegeben.

Ich musste dies für eine der CA Zertifikate von RapidSSL tun.

+0

Ich denke, mein Lieblingsteil war, wo er sagte, dass er es tun wollte, ohne keytool zu benutzen, und du hast ihm gesagt, er solle keytool benutzen;) –

+0

Wahr. Aber ich kann mir nicht vorstellen, einen Java TrustManager zu schreiben und diese App irgendwie einfacher zu verteilen als eine Skript-Lösung, die keytool verwendet, selbst in einer gemischten Umgebung. – farcepest

0

Sun veröffentlicht diesen Code eine aktualisierte Version Ihrer Datei cacerts basierend auf einer beliebigen Ziel-Host erstellen läuft https mit irgendwelchen Zert:

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

Ihr neuer cacerts wird genannt jssecacerts im aktuellen Verzeichnis werden. Kopieren Sie diese neue Datei einfach in Ihre jre/lib/security/cacerts-Datei.

Ich mache keinen Kommentar über die Sicherheit Ihrer neuen Cacerts-Datei.

Verwandte Themen