Zusammenfassung: Wie installiere ich ein neues Wurzelzertifikat mit Java-Code in Java?
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 Trustwave-SSL-Zertifikate von normalen Internetbrowsern akzeptiert werden, scheint Java nicht mit den erforderlichen Stammzertifikaten zu kommen, und wir haben den Zugriff auf den angegebenen Webdienst mit der folgenden Fehlermeldung verloren:
%Vor%Wir haben eine zeitweilige Begnadigung erhalten, indem wir den Anbieter überzeugt haben, zu Verisign zurückzukehren, aber wenn sie zurückwechseln, 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) usw.).
Ich stelle mir vor, dass das Keytool Java intern verwendet. Welchen Befehl könnte ich innerhalb von Java verwenden, um die Funktionalität von keytool zu replizieren und das Root-Zertifikat programmatisch zu installieren?
IMHO, Sun hat keytool nicht über eine API verfügbar gemacht, hauptsächlich um zu verhindern, dass Entwickler die Gruppe vertrauenswürdiger Zertifizierungsstellen ändern. Ich kann mir sehr gut vorstellen, dass Angreifer solchen Code ausnutzen, um ihre eigenen Root-Zertifikate in den Trust Store einzufügen, die das Modell des Truststores kompromittieren.
Wenn Sie sich die Quelle der KeyTool-Klasse (Paket sun.security.tools) ansehen, ist sie nicht nur endgültig, sondern hat auch einen privaten Konstruktor, der verhindert, dass ein Aufrufer eine Instanz der KeyTool-Klasse aus dem Code erzeugt . 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 einzigen (vereinfachenden) Ansätze wären:
Sie können KeyTool immer als Prozess Runtime.exec(...)
aufrufen.
Wenn Sie das Zertifikat im Keystore des vertrauenswürdigen Stamms auf dem Desktopcomputer installieren möchten, benötigen Sie dazu die entsprechende Berechtigung. Dasselbe gilt für das Keytool . Sie benötigen ein Passwort, um auf den Keystore des vertrauenswürdigen Root zugreifen zu können. Wenn Sie schnell-n-schmutzig sein wollen, können Sie
KeyTool
class ( sun.security.tools.KeyTool
) Aber IMHO, wenn das Zertifikat nicht gültig ist, dann ist es nicht vertrauenswürdig. Ich würde sagen, dafür gibt es einen guten Grund.
Befehlszeilenlösung. Auf dem Mac ist das Java-Home / Library / Java /Zuhause. Probieren Sie:
%Vor%Ersetzen Sie CAName durch den Namen Ihrer CA und CA.crt durch einen Pfad zu Ihrer Zertifikatsdatei (PEM funktioniert). Es wird nach einem Schlüsselspeicherkennwort gefragt. Das Standardkennwort ist in dem verknüpften Artikel angegeben.
Ich musste dies für eine CA-Zertifizierung von RapidSSL tun.
Sun hat diesen Code veröffentlicht, um eine aktualisierte Version Ihrer cacerts-Datei basierend auf einem beliebigen Zielhost zu erstellen, auf dem https mit beliebigen Zertifikaten ausgeführt wird:
Ihre neuen Cacerts werden im aktuellen Verzeichnis jssecacerts genannt. Kopieren Sie diese neue Datei einfach über Ihre jre / lib / security / cacerts-Datei.
Ich mache keinen Kommentar zur Sicherheit Ihrer neuen cacerts-Datei.
Tags und Links java root ssl-certificate