Optionen, für ein Programm Hinzufügen der Zertifikate zum Java-KeyStore
War ich immer ein SSL-Handshake-Ausnahmefehler: PKIX "Pfad nicht Kette" (hier beschrieben).
Ich habe es behoben durch den Import einer Zertifikatskette mit openssl:
openssl s_client -host www.envmgr.com -port 443 -showcerts > cert_chain.crt
installiert und es in mein JDK-s-keystore:
keytool -import -alias envmgrchain -file cert_chain.crt -keystore cacerts -storepass changeit
Gut das funktioniert. Hurra. Das problem ist, werden wir dabei sein, unsere Anwendung auf einer cloud-server, wie rackspace oder AWS und ich denke, es ist eine gute chance, dass wir keinen Zugriff zum ändern des Schlüsselspeicher der JVM hinzufügen dieser Kette.
Dachte ich, "kein problem, ich werde nur hinzufügen, dass dieses Zertifikat-Kette, um die keystore-Programm" so ich entfernt es von meinem JVM:
keytool -delete -alias envmgrchain -keystore cacerts -storepass changeit
Hinzugefügt und dieser code:
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
//Create an empty keystore that we can load certificate into
trustStore.load(null);
InputStream fis = new FileInputStream("cert_chain.crt");
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while(bis.available()>0) {
Collection<? extends Certificate> certs = cf.generateCertificates(bis);
Iterator<? extends Certificate> iter = certs.iterator();
//Add each cert in the chain one at a time
for(int i=0; i<certs.size(); i++) {
Certificate cert = iter.next();
String alias = "chaincert"+((i>0)?i:"");
trustStore.setCertificateEntry(alias, cert);
}
}
bis.close();
fis.close();
//Add custom keystore to TrustManager
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(trustStore);
SSLContext ctx = SSLContext.getInstance("TLSv1");
ctx.init(null, tmf.getTrustManagers(), null);
Aber wenn ich es laufen, die PKIX Fehler wieder. Ist der obige code nicht entspricht keytool-import? Ich fühle mich wie ich bin, entweder indem Sie Zertifikate auf den KeyStore falsch, oder bin ich nicht die Installation der Schlüsselspeicher in den TrustManager in der richtigen Weise.
FYI: ich bin auch der Versuch, dieses Problem zu beheben, indem Sie einerseits einen X509TrustManager.
- Was nur den Versand der truststore, die Sie verwenden möchten, mit Ihrer Anwendung und Referenz es über vm-Argumente?
- Auch hier ist ein berühmtes Beispiel von Andreas Sterbenz genannt InstallCert das tut, was Sie zu tun versuchen, aber Sie haben zu analysieren, wenn der code, um zu bekommen, was Sie genau möchten: code.google.com/p/java-use-examples/source/browse/trunk/src/com/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist code, den Sie verwenden können, für die Kunden, um programmgesteuert hinzufügen Ihrer CA zur Laufzeit. Sie nicht brauchen, um es in keinem laden - nur tragen rund um die PEM-kodierten Datei. Sie können auch hart-code in Ihr Programm, so gibt es keine separaten Datei zu verwalten.
Benötigen Sie eine Vertrauenswürdige Vertriebskanäle, um sicherzustellen, dass Ihr Programm wird nicht geändert, während das sitzen auf den server wartet, ausgewählt zu werden oder während der Reise nach unten den Draht, während installiert wird.
Sollten Sie nur brauchen, um Vertrauen, das Stammzertifikat und nicht die gesamte Kette. Der server ist verantwortlich für das senden alle zwischen-Zertifikate erforderlich, um das erstellen der Kette. Wenn der server nicht senden, werden alle zwischen-Zertifikate erforderlich, um das erstellen der Kette, dann ist der server falsch konfiguriert ist.
Das problem, das Sie erleben, wird als "Das Verzeichnis" problem. Seine ein bekanntes problem, dass die PKI. Im wesentlichen, es bedeutet, dass ein client nicht weiß, wo Sie gehen zu Holen ein intermediate Zertifikat fehlt. Sie lösen es, indem er den server senden alle erforderlichen Zwischenprodukte zusammen mit dem server-Zertifikat. Siehe OWASP TLS-Cheatsheet und Regel - Immer Bieten Alle Notwendigen Zertifikate.
Nur Fahrrad zu vergießen, aber es gibt eine ganze nother can of worms hier mit Java (insbesondere Java 7 und niedriger):
Können Sie verbessert Sie, falls gewünscht. Sehen
SSLSocketFactoryEx
bei Welche Cipher Suites), um für die SSL-Socket?. Es schließt einige Lücken in der Protokoll-Versionen, cipher suites, etc zur Verfügung gestellt, die standardmäßig in JavaSSLSocketFactory
.X509TrustManager
..." - ja, seine feine zu tragen, um den server erwartet Zertifikat. Das nennt man anpinnen, und seine große Sicherheit. Seine beats den Rotz aus dem Web-Security-Modell. Siehe OWASP ' s Zertifikat und Public-Key-Pinning.Nicht. Du solltest dich nicht ändern von Dateien, die im Lieferumfang der JRE. Als Nächstes aktualisieren Sie Ihre updates verschwunden sind. Sollten Sie den Versand Ihrer eigenen truststore, gebaut von der, die kommt mit der JRE plus was auch immer zusätzliche Zertifikate, die Sie wollen, zu Vertrauen. Dies ist Teil Ihrer Anwendung erstellen.
Wenn Sie möchten, ändern Sie Ihre eigenen truststore zur Laufzeit, gehen Sie vor, aber dann müssen Sie sich bewusst sein, dass die JVM nicht unbedingt sehen, die änderungen, bis es neu gestartet wird: es wird sicherlich nicht sehen, wie Sie innerhalb der gleichen
SSLContext
, die Sie verwenden, erhalten Sie die Zertifikate, die Sie hinzufügen möchten.