Bug #295
offenFalsche Meldung "Zertifikat-Besitzer passt nicht zum Hostnamen"
Beschreibung
Hallo Martin,
Seit ein paar Tagen funktioniert die Kommunikation mit den Servern z.B. der GLS Bank nicht mehr. Es kommt die Meldung "Zertifikat-Besitzer passt nicht zum Hostnamen". Konfiguriert ist schon sehr lange die URL https://hbci-pintan.gad.de/cgi-bin/hbciservlet, d.h. es wird erwartet, dass das Zertifikat für den Hostnamen hbci-pintan.gad.de gültig ist.
Schaut man sich das vom Server vorgelegte Zertifikat näher an, ist leider festzustellen, dass dieses tatsächlich (auch) für hbci-pintan.gad.de gültig ist. In der Zertifikatserweiterung SubjectAltName (SAN) wird hbci-pintan.gad.de korrekt aufgeführt.
Zitat von https://en.wikipedia.org/wiki/Subject_Alternative_Name
RFC 2818 (May 2000) specifies Subject Alternative Names as the preferred method of adding DNS names to certificates, deprecating the previous method of putting DNS names in the commonName field.[3] Google Chrome version 58 (March 2017) removed support for checking the commonName field at all, instead only looking at the SANs.
Wenn das Zertifikat also gültig ist aber von AqBanking nicht als korrekt akzeptiert wird, liegt hier wohl ein Bug vor.
Ich habe mich gleich im Code auf die Suche gemacht. Anscheinend ist die inkorrekte Prüfung in src/sio/syncio_tls.c an dieser Stelle:
1041 rv=gnutls_x509_crt_get_dn_by_oid(cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, buffer1, &size);
1042 if (rv==0) {
1043 GWEN_SslCertDescr_SetCommonName(certDescr, buffer1);
1044 if (xio->hostName && strcasecmp(xio->hostName, buffer1)!=0) {
1045 DBG_INFO(GWEN_LOGDOMAIN, "Owner of certificate does not match hostname");
1046 errFlags|=GWEN_SSL_CERT_FLAGS_BAD_HOSTNAME;
1047 }
Hier wird offenbar nur der Common Name aus dem Zertifikat geprüft, aber nicht die "Subject Alt Name"-Erweiterung.
Gibt es einen Grund, warum in Gwenhywfar die Prüfung von Hand implementiert hat, obwohl GnuTLS die Verifikation des Hostnames (und vieler anderer Parameter) schon von Haus aus macht (API-Funktion gnutls_session_set_verify_cert
)?
Von mlenk vor mehr als 2 Jahren aktualisiert
Sieht so aus als sei die Hostname-Validierung des Zertifikats doppelt implementiert (gleiche Datei):
975 DBG_INFO(GWEN_LOGDOMAIN, "Checking hostname [%s]", xio->hostName);
976 if (!gnutls_x509_crt_check_hostname(cert, xio->hostName)) {
977 DBG_WARN(GWEN_LOGDOMAIN,
978 "Certificate was not issued for this host");
979 GWEN_Gui_ProgressLog(0, GWEN_LoggerLevel_Warning,
980 I18N("Certificate was not issued for this host"));
981 errFlags|=GWEN_SSL_CERT_FLAGS_BAD_HOSTNAME;
982 }
Diese Implementierung sieht vollkommen ausreichend aus.
Von mlenk vor mehr als 2 Jahren aktualisiert
Wenn man die Zeilen 1044 bis 1047 löscht, ist das Problem behoben.
Ein nicht zum Hostnamen passendes Zertifikat wird dann trotzdem korrekterweise als potentielles Problem angezeigt.
Ich lösche diese Zeilen mal im Git.
Von mlenk vor mehr als 2 Jahren aktualisiert
Nur der Vollständigkeit halber, ich habe diesen Bug auch im Debian-Bugtracker erfasst
https://bugs.debian.org/1034577