SSL Problem mit Java 7
Java, Linux/OpenSource Juli 25th, 2011Nachdem ich (wie im vorherigen Artikel beschrieben) nun OpenJDK / Java 7 selber kompiliert habe, habe ich mich auf die Suche nach dem SSL Problem gemacht, dass ich mit Jameica/Hibiskus habe. (No offense, ich find es leichter OpenJDK zu übersetzen oder anzupassen als Jameica und Hibiskus zu bauen… praktischerweise bringt OpenJDK auch Netbeans Projektdateien mit, so dass es ein Klacks ist, das Projekt mit Netbeans zu verwenden.)
Nachdem ich folgenden Patch geschrieben habe habe:
diff -r 9b8c96f96a0f src/share/classes/sun/security/ssl/SSLContextImpl.java --- a/src/share/classes/sun/security/ssl/SSLContextImpl.java Mon Jun 27 13:21:34 2011 -0700 +++ b/src/share/classes/sun/security/ssl/SSLContextImpl.java Mon Jul 25 19:30:11 2011 +0200 @@ -871,7 +871,7 @@ } } catch (CertPathValidatorException cpve) { throw new CertificateException( - "Certificates does not conform to algorithm constraints"); + "Certificates does not conform to algorithm constraints", cpve); } } }
ist jetzt auch zu sehen, was die Ursache fuer den SSL Fehler ist:
Caused by: java.security.cert.CertPathValidatorException: Algorithm constraints check failed: MD2withRSA at sun.security.provider.certpath.AlgorithmChecker.check(AlgorithmChecker.java:200) at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(SSLContextImpl.java:870) ... 21 more org.kapott.hbci.manager.HBCIUtils.log(HBCIUtils.java:1052)
OpenJDK kommt übrigens ohne Root Zertifikate daher, so dass man sich nicht über einen solchen Dialog wundern sollte:
Nachdem man die Exception genauer ansieht, ist man auch etwas schlauer geworden: Irgendein Zertifikat ist mit einem nicht mehr als sicher geltenden Algorithmus signiert. Das der Apobank selbst ist es offensichtlich jedoch nicht, also muss die gesamte Zertifikatskette untersucht werden.
Hier habe ich etwas Shell-Magie und das OpenSSL Kommandozeilentool verwendet:
openssl s_client -showcerts -connect hbcibanking.apobank.de:443 < /dev/null | awk -v c=-1 '/-----BEGIN CERTIFICATE-----/{inc=1;c++} inc {print > ("cert-" c ".pem")}/---END CERTIFICATE-----/{inc=0}'; for i in cert-?.pem; do openssl x509 -noout -serial -subject -issuer -in "$i"; done
Danach finden sich alle Zertifikate in cert-1.pem, cert-2.pem usw., die Ausgabe der Seriennummern, Subject und Issuer sah bei mir so aus:
serial=4FCD4C50631D3BB4C747A319E816AD5D
subject= /C=DE/ST=NRW/L=Duesseldorf/O=Deutsche Apotheker- und Aerztebank/OU=Terms of use at www.verisign.com/rpa (c)05/CN=hbcibanking.apobank.de
issuer= /O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign International Server CA - Class 3/OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
serial=254B8A853842CCE358F8C5DDAE226EA4
subject= /O=VeriSign Trust Network/OU=VeriSign, Inc./OU=VeriSign International Server CA - Class 3/OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
serial=70BAE41D10D92934B638CA7B03CCBABF
subject= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
Nun müssen alle Zertifikate untersucht werden:
openssl x509 -text -in cert-0.pem
Und entsprechend für die anderen Zertifikate in der Kette. Ich wurde dann bei dem dritten Zertifikat fündig:
tkruse@charix:~$ openssl x509 -text -in cert-2.pem
Certificate:
Data:
Version: 1 (0x0)
Serial Number:
70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf
Signature Algorithm: md2WithRSAEncryption
Issuer: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
Validity
Not Before: Jan 29 00:00:00 1996 GMT
Not After : Aug 1 23:59:59 2028 GMT
Subject: C=US, O=VeriSign, Inc., OU=Class 3 Public Primary Certification Authority
Ein „betagtes“ altes VeriSign Zertifikat das mit MD2 und RSA signiert wurde. Auch wenn der MD2 Signaturalgorithmus noch nicht gebrochen ist, gibt es einige Angriffe, die dazu geführt haben, dass MD2 seit 2009 nicht mehr in OpenSSL verwendet wird.
Was heißt das nun für das konkrete SSL Problem? Die ApoBank wird sich eh um Januar 2012 herum spätestens ein neues SSL Zertifikat besorgen. Dann sollte der Spuk zu ende sein. Besser wäre es allerdings wenn die betroffenen Anbieter ihre SSL Zertifikate jetzt erneuern – es geht schließlich um Online Banking!
Und wieso fällt das erst seit Java 7 auf? Seit Java 7 ist offenbar die Möglichkeit neu hinzugekommen die Algorithmen zu prüfen oder wurde geändert. Eigentlich sollte seit Java 6u17 bereits MD2 nicht mehr unterstützt werden, zumindest gibt es einen entsprechenden Eintrag in den Release notes: http://www.oracle.com/technetwork/java/javase/6u17-141447.html.
Juli 26th, 2011 at 10:00
Vielen Dank fuer die Analyse.
Ich hoffe nur, dass die Banken bzw. CAs hier tatsaechlich reagieren und die betroffenen Zertifikate ersetzen. Im Moment bin ich da noch skeptisch. Da Jameica ja ebenfalls einen TrustManager besitzt (der selbst prueft, ob das Zertifikat im Jameica-Keystore importiert und damit vertrauenswuerdig ist), muesste ich dann ggf. dort einen Workaround einbauen.
> ich find es leichter OpenJDK zu übersetzen oder anzupassen
> als Jameica und Hibiskus zu bauen
Ach Quatsch – das ist doch ganz einfach 😉
cvs -d:pserver:[email protected]:/cvsroot/jameica co jameica
cd jameica/build
ant fast
cd ../..
cvs -d:pserver:[email protected]:/cvsroot/hibiscus co hibiscus
cd hibiscus/build
ant fast
Fertig. Die Builds liegen dann jeweils in „releases/$version“
Juli 26th, 2011 at 10:13
Danke für den Tipp – dann werde ich mir das bei Gelegenheit nochmal ansehen. (Mir dämmert auch langsam dass ich das verwechselt habe… mea culpa)
Ich würde ehrlich gesagt keine Workarounds implementieren um solche Gammel-Zertifikate doch zu akzeptieren. Die Kunden sollten der jeweiligen Bank Feuer unterm xxx machen, damit solche potentiell sicherheitsrelevanten Probleme behoben werden. (Ich glaub mit dem TrustManager ist es auch nicht getan, seit Java 7 gibts da so „AlgorithmConstraints“ mit denen schwache Glieder in der Zertifikatkette ausgesondert werden, auch wenn das Zertifikat selber gültig und akzeptiert ist ist. (Ich hab ja das Zertifikat akzeptieren müssen da ich einen leeren truststore hatte.)
August 1st, 2011 at 10:31
Ich hab mir Java 7 inzwischen auch mal installiert und getestet. Meine Sparkasse ist auch betroffen. Ich befuerchte fast, dass das keine Einzelfaelle sind. Und merkwuerdigerweise findet man beim Googlen nach „Certificates does not conform to algorithm constraints“ bisher quasi nur Treffer von deiner und meiner Webseite. Also entweder mache ich in Jameica was falsch oder bisher ist sonst noch keiner da drueber gestolpert. Oder alle anderen haben saubere Zertifikate. 😉
August 1st, 2011 at 10:35
Ich kann dazu nur sagen, dass es mit der DKB Bank super funktioniert 🙂
Ich denke, dass es in der Tat ein groesseres Problem mit den Zertifikaten ist, und Jameica sich korrekt verhaelt.
August 2nd, 2011 at 10:22
Das Zertifikat selber ist OK. Das Problem liegt vielmehr in der Konfiguration des Webservers. Dieser liefert auch das Root-Zertifikat von Verisign mit aus. Dieses muss man nur aus dem „SSLCACertificateFile“ (siehe http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#sslcacertificatefile) entfernen.
Dezember 31st, 2011 at 12:27
Bei mir klappt der Scripting Abruf der Kreditumsätze für die DKB mit JDK 1.7 nicht. Dieses nutzt allerdings auch die https Verbindung der Weboberfläche. Die DKB scheint also unterschiedliche Zertifikate oder Konfigurationen für die https Weboberfläche und HBCI zu nutzen.
Dezember 31st, 2011 at 12:32
Die DKB hat ihrerseits auch Aenderungen vorgenommen, so dass das Script aktualisiert werden muss. Bei mir klappt das seit dem 🙂
Dezember 31st, 2011 at 12:38
Hallo everflux,
hast du diesen Patch schon an das OpenJDK Projekt geschickt?
Es wäre doch schön wenn diese Verbesserung auch in den offiziellen Sourcecode übernimmt.
Grüße,
Jochen
Dezember 31st, 2011 at 12:40
hier der Link zum JDK 7 Sourcecode (dort ist es noch nicht drin).
http://hg.openjdk.java.net/jdk7/hotspot/jdk/file/9c29dd06e138/src/share/classes/sun/security/ssl/SSLContextImpl.java
Dezember 31st, 2011 at 12:50
Nein, habe ich nicht. Ich muss gestehen, dass ich nicht weiss, wie man da einen Patch submittet und hatte nach kurze Suche auch schnell aufgegeben.
Januar 3rd, 2012 at 16:40
Everflux, kannst du uns dein korrigiertes DKB-Visa Skript irgendwo zur Verfügung stellen oder erklären was du geändert hast?
Danke und Gruß
Januar 3rd, 2012 at 18:21
Ich hab das nicht(mal) selber korrigiert, sondern ganz normal die allerneueste Version von der Webseite genommen: http://www.wiedenhoeft.net/1411-hibiscusdkb-visa-endlosschleife-bei-login.html
August 23rd, 2012 at 17:20
Hallo, könnte mir jemand sagen, was bei https://banking.dkb.de der veraltete Algo ist, damit man deren Techniker in die richtige Richtung schubsen kann?