2016-06-09 5 views
0

ich den folgenden Code am Prüfsiegel Hash-Code auf meinem Rechner zum Nachschlagen und dann den gleichen Code auf einem anderen vm laufen mit Java 7.Server-Zertifikat-Hash-Code-Änderungen zwischen Java-Versionen

Ich bin verwirrt den Unterschied zu sehen auf Hashcode.

Hier ist mein Code:

import javax.net.ssl.HttpsURLConnection; 
import java.net.URL; 
import java.security.cert.Certificate; 

public class Main { 

public static void main(String[] args) throws Exception { 
    HttpsURLConnection urlc = (HttpsURLConnection) new URL("https://www.google.com").openConnection(); 
    print_https_cert(urlc); 
} 


private static void print_https_cert(HttpsURLConnection con) { 

    if (con != null) { 

     try { 

      System.out.println("Response Code : " + con.getResponseCode()); 
      System.out.println("Cipher Suite : " + con.getCipherSuite()); 
      System.out.println("\n"); 

      Certificate[] certs = con.getServerCertificates(); 
      for (Certificate cert : certs) { 
       System.out.println("Cert Type : " + cert.getType()); 
       System.out.println("Cert Hash Code : " + cert.hashCode()); 
       System.out.println("Cert Public Key Algorithm : " 
         + cert.getPublicKey().getAlgorithm()); 
       System.out.println("Cert Public Key Format : " 
         + cert.getPublicKey().getFormat()); 
       System.out.println("\n"); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 
} 

Hier ist, was ich mit Java bekommen 1.7.0_79

Response Code: 200

Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Cert Typ : X.509 Cert Hash Code: 10920939 Cert öffentlicher Schlüssel Algorithmus : RSA Cert Public Key Format: X.509

Cert Typ: X.509 Cert Hash-Code: 6561088 Cert Public Key Algorithmus: RSA Cert Public Key Format: X.509

Cert Typ: X 0,509 Cert Hash-Code: 8774863 Cert Public Key Algorithmus: RSA Cert Public Key Format: X.509

und hier ist die Ausgabe mit Java 1.8.0_77

Response Code: 200 Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

Cert Typ: X.509 Cert Hash-Code: -106561125 Cert Public Key Algorithmus: RSA Cert Public Key Format: X.509

Cert Typ: X.509 Cert Hash-Code: 771393018 Cert Public Key Algorithmus : RSA Cert Public Key Format: X.509

Cert Typ: X.509 Cert Hash-Code: 349192256 Cert Public Key Algorithmus : RSA Cert Public Key Format: X.509

Sollte der Hashcode gleich sein oder fehle ich hier etwas?

+0

Connection ist eine andere Chiffre-Suite mit einem anderen Hash alogrithm verwenden? TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 vs TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA – hoipolloi

Antwort

0

Die Methode hascode() von java.security.cert.Certificate wurde geändert. Zumindest für openjdk:

Java7 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/security/cert/Certificate.java#Certificate.hashCode%28%29

java8 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/security/cert/Certificate.java#Certificate.hashCode%28%29

Der Hash-Code ist erlaubt zwischen der JDK-Version zu ändern. Es ist primär zu speichern Object s in HashMap s. Es wird absolut ignoriert, den Hashcode eines Objekts "draußen" zu übergeben oder fortzuschreiben.

Wenn Sie eine Hashsumme des Zertifikats benötigen, empfehle ich Ihnen, Ihre eigene Hashing-Funktion zu implementieren, damit Sie nicht von internen Verhaltensweisen abhängig sind, die sich ändern dürfen.

Es gibt keinen strikten Algorithmus, wie man einen Hashcode für ein Java-Objekt berechnet. Implementoren müssen nur mit dem hashcode() und equals() Vertrag übereinstimmen.

http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--

1

Ein hashCode() ist nicht identisch zwischen verschiedenen Ausführungen des gleichen Programms, geschweige denn verschiedene Java-Versionen. Du rufst die falsche Methode an. Sie sollten X509Certificate.getSerialNumber() anrufen.