web-dev-qa-db-de.com

java.security.cert.CertificateException: Zertifikate entsprechen nicht den Algorithmuseinschränkungen

Ich habe eine Kartenanwendung, die ArcGIS 9.3+ base-Karten mit einer URL hinzufügen kann. Eine der URLs, die ich hinzufügen möchte, stammt von der URL eines Kunden und ist gesichert. Meine Kartenanwendung verwendete zuvor Java 6 und konnte die sichere URL ohne Probleme hinzufügen. Ich habe jetzt ein Upgrade auf Java 7 durchgeführt und bekomme eine 

"Java.security.cert.CertificateException: Certificates does not conform to algorithm constraints"

ausnahme. Zunächst glaube ich, dass dies der Fall ist, da in Java 7 standardmäßig der MD2-Algorithmus zum Signieren von SSL-Zertifikaten deaktiviert ist. Sie können dies in der Java.security-Datei sehen:

"jdk.certpath.disabledAlgorithms=MD2"

Wenn ich jedoch den Certification Signature Algorithm dieser URL überprüfe, wird SHA-1 angezeigt. Noch merkwürdiger ist, wenn ich die "jdk.certpath.disabledAlgorithms=MD2"-Zeile in der Java.security-Datei auskommentiere, funktioniert die URL ohne Probleme. Wird MD2 während des SSL-Prozesses an anderer Stelle verwendet? Fehlt mir hier etwas?

32
james

Hintergrund

MD2 wurde in Java in Version JDK 6u17 allgemein als unsicher erkannt und daher deaktiviert (siehe Versionshinweise http://www.Oracle.com/technetwork/Java/javase/6u17-141447.html , "Deaktivieren Sie MD2 im Zertifikat Kettenvalidierung ") sowie JDK 7 gemäß der Konfiguration, die Sie in Java.security angegeben haben.

Verisign verwendete ein Klasse-3-Stammzertifikat mit dem md2WithRSAEncryption-Signaturalgorithmus (seriell 70:ba:e4:1d:10:d9:29:34:b6:38:ca:7b:03:cc:ba:bf), wurde jedoch als veraltet eingestuft und durch ein anderes Zertifikat mit demselben Schlüssel und Namen ersetzt, der jedoch mit dem Algorithmus sha1WithRSAEncryption signiert war. Einige Server senden jedoch immer noch das alte MD2-signierte Zertifikat während des SSL-Handshakes (ironischerweise stieß ich bei einem von Verisign betriebenen Server auf dieses Problem!).

Sie können dies mit folgendem verifizieren:

openssl s_client -showcerts -connect <server>:<port>

Aktuelle Versionen des JDK (z. B. 6u21 und alle veröffentlichten Versionen von 7) sollten lösen dieses Problem durch automatisches Entfernen von Zertifikaten mit demselben Aussteller und demselben öffentlichen Schlüssel als vertrauenswürdiger Anker (standardmäßig in Cacerts).

Wenn Sie dieses Problem noch mit neueren JDKs haben

Überprüfen Sie, ob Sie über einen benutzerdefinierten Trust-Manager verfügen, der die ältere X509TrustManager-Schnittstelle implementiert. JDK 7+ soll mit dieser Schnittstelle kompatibel sein, basiert jedoch auf meiner Untersuchung, wenn der Trust-Manager X509TrustManager anstelle des neueren X509ExtendedTrustManager ( docs ) implementiert, das JDK seinen eigenen Wrapper (AbstractTrustManagerWrapper) verwendet und das interne irgendwie umgeht Fix für dieses Problem.

Die Lösung ist zu:

  1. verwenden Sie den Standard-Vertrauensmanager oder

  2. Ändern Sie Ihren benutzerdefinierten Vertrauensmanager, um X509ExtendedTrustManager direkt zu erweitern (eine einfache Änderung).

49
Raman

Eclipse konnte keine Verbindung zu SVN-https-Repositorys herstellen (sollte auch für jede App gelten, die SSL/TLS verwendet).

svn: E175002: Verbindung wurde geschlossen: javax.net.ssl.SSLHandshakeException: Java.security.cert.CertificateException: Zertifikate entsprechen nicht den Algorithmuseinschränkungen

Das Problem wurde durch ein aktuelles Java 8 OpenJDK-Update verursacht, das MD5-bezogene Algorithmen deaktiviert hat. Ändern Sie als Problemumgehung bis zur Ausstellung neuer Zertifikate (falls überhaupt) die folgenden Schlüssel in der Datei Java.security

WARNUNG
Beachten Sie, dass dies Auswirkungen auf die Sicherheit haben kann, da deaktivierte Algorithmen als schwach angesehen werden . Als Alternative kann workaround auf JVM-Basis über eine Befehlszeilenoption angewendet werden, um eine externe Java.security -Datei mit diesen Änderungen zu verwenden, z.
Java -Djava.security.properties=/etc/sysconfig/noMD5.Java.security
Fügen Sie für Eclipse eine Zeile in Eclipse.ini unter -vmargs hinzu.
-Djava.security.properties=/etc/sysconfig/noMD5.Java.security

originalschlüssel

jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768

ändern

jdk.certpath.disabledAlgorithms=MD2, RSA keySize < 1024
jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768

Die Java.security-Datei befindet sich in linux 64 unter __./usr/lib64/jvm/Java/jre/lib/security/Java.security

24
Luis Muñoz

Achten Sie auf Fedora 28 einfach online 

security.useSystemPropertiesFile = true

von Java.security Eigenschaften.

In Fedora 28 wurde eine externe Datei von disabledAlgorithms Control unter eingeführt 

/etc/crypto-policies/back-ends/Java.config

Sie können diese externe Datei bearbeiten oder von Java.security ausschließen.

Wir haben dieses Problem mit einer Datenbank, die wir nicht kontrollieren können, und es wurde eine andere Lösung benötigt (die hier aufgeführten haben nicht funktioniert). Für meine brauchte ich:

-Djdk.tls.client.protocols="TLSv1,TLSv1.1"

Ich glaube in meinem Fall hatte es damit zu tun, eine bestimmte Ordnung zu erzwingen.

4
Bill K

kollegen.

Bei der Entwicklung von Automatisierungstests für unsere REST - API bin ich mit diesen Problemen konfrontiert. JDK 7_80 wurde nur auf meinem Computer installiert. Bevor ich JDK 8 installierte, funktionierte alles einwandfrei und ich hatte die Möglichkeit, OAuth 2.0-Token mit einer JMeter zu erhalten. Nachdem ich JDK 8 installiert hatte, begann der Albtraum mit Certificates does not conform to algorithm constraints

Sowohl JMeter als auch Serenity hatten keine Möglichkeit, ein Token zu erhalten. JMeter verwendet die JDK-Bibliothek, um die Anforderung zu stellen. Die Bibliothek löst nur eine Ausnahme aus, wenn der Bibliotheksaufruf zum Herstellen einer Verbindung zu Endpunkten ausgeführt wird, die diese verwenden, und die Anforderung ignoriert.

Als nächstes mussten comment alle Zeilen für disabledAlgorithms inALLJava.security-Dateien angegeben werden. 

C:\Java\jre7\lib\security\Java.security
C:\Java\jre8\lib\security\Java.security
C:\Java\jdk8\jre\lib\security\Java.security
C:\Java\jdk7\jre\lib\security\Java.security

Dann fing es endlich an zu arbeiten. Ich weiß, das ist ein brutaler Ansatz, aber es war der einfachste Weg, ihn zu beheben.

# jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
# jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
1
Lord Nighton

dies ist wahrscheinlicher, weil Sie irgendwo entlang Ihrer Zertifikatskette ein Zertifikat haben, wahrscheinlicher ein altes Root-Verzeichnis, das noch mit dem MD2RSA-Algorithmus signiert ist.

Sie müssen es in Ihrem Zertifikatsspeicher finden und löschen.

Dann kehren Sie zu Ihrer Zertifizierungsstelle zurück und fragen Sie sie nach einem neuen Stamm.

Es ist wahrscheinlicher, dass es sich um dieselbe Wurzel mit demselben Gültigkeitszeitraum handelt, sie wurde jedoch mit SHA1RSA erneut zertifiziert.

Ich hoffe das hilft.

1
snlpnstslocn

Ich habe dieses Problem in SOAP-UI und keine Lösung oben hat mir nicht geholfen.

Die richtige Lösung für mich war hinzuzufügen

-Dsoapui.sslcontext.algorithm = TLSv1 

in der Datei vmoptions (in meinem Fall war es ...\SoapUI-5.4.0\bin\SoapUI-5.4.0.vmoptions)

0
menkow

Da dieses Ergebnis das erste ist, das Google für diesen Fehler zurückgibt, füge ich hinzu: Wenn jemand nach Möglichkeiten sucht, die Java-Sicherheitseinstellungen zu ändern, ohne die globale Datei Java.security zu ändern (zum Beispiel müssen Sie einige Tests ausführen), können Sie dies tun Geben Sie einfach eine überschreibende Sicherheitsdatei mit dem JVM-Parameter -Djava.security.properties = Ihre/file/path an, in der Sie die erforderlichen Algorithmen aktivieren können, indem Sie die Deaktivierungen überschreiben.

0
Joonas Vali

Verwendung von openjdk-7 im Docker Ich habe eine Datei mit dem Inhalt https://Gist.github.com/dtelaroli/7d0831b1d5acc94c80209a5feb4e8f1c#file-jdk-security angehängt

#Location to mount
/usr/lib/jvm/Java-7-openjdk-AMD64/jre/lib/security/Java.security

Vielen Dank @ Luis-Muñoz

0
dtelaroli