Diese können aus Gründen der Klarheit als separate Fragen formuliert werden, beziehen sich jedoch alle auf dasselbe Thema.
Wie werden SSL-Zertifikatservernamen aufgelöst?
Warum scheinen Browser das CN-Feld des Zertifikats zu verwenden, aber der Java-Mechanismus scheint nur "alternative Betreffnamen" zu betrachten?
Ist es möglich, mit keytool alternative Namen zu einem SSL-Zertifikat hinzuzufügen? Wenn nicht, ist die Verwendung von openSSL stattdessen eine gute Option?
Nur ein kleiner Hintergrund: Ich brauche einen Hauptserver, um mit mehreren Servern über HTTPS zu kommunizieren. Natürlich möchten wir nicht für jeden Server SSL-Zertifikate kaufen (es können viele sein), daher möchte ich selbstsignierte Zertifikate verwenden (ich habe Keytool verwendet, um sie zu generieren). Nachdem ich die Zertifikate als vertrauenswürdig im Betriebssystem hinzugefügt habe, akzeptieren die Browser (IE und Chrome) die Verbindung gerne als vertrauenswürdig. Selbst nach dem Hinzufügen der Zertifikate zu Javas Cacerts akzeptiert Java die Verbindung nicht als vertrauenswürdig und löst die folgende Ausnahme aus:
Auslöser: java.security.cert.CertificateException: Bei sun.security.util.HostnameChecker.matchIP (HostnameChecker.java:142) bei sun.security.util.HostnameChecker.match (HostnameChecker.java:75) sind keine alternativen Betreffnamen vorhanden. at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkIdentity (X509T rustManagerImpl.java:264) at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrustr. sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate (Clien tHandshaker.java:1185) ... 14 weitere
Ich habe festgestellt, dass ich Java das Zertifikat vertrauen lassen kann, das meinen eigenen HostNameVerifier implementiert, den ich von hier kopiert habe: com.sun.jbi.internal.security.https.DefaultHostnameVerifier, nur um zu testen (übrigens, der Hostname wurde als Argument an den übergeben HostnameVerifier ist korrekt, daher denke ich, dass es hätte akzeptiert werden sollen.
Ich habe das Zertifikatfeld CN als Hostnamen verwendet (normalerweise die IP-Adresse).
Kann mir bitte jemand sagen, ob ich etwas falsch mache und mich in die richtige Richtung weisen?