服务器证书哈希代码在java版本之间更改

时间:2016-06-09 20:49:39

标签: java ssl hash https

我正在测试以下代码以在我的机器上查找证书哈希码,然后在不同的vm上使用java 7运行相同的代码。

我很困惑地看到哈希码的区别。

这是我的代码:

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();
        }

    }
}
}

以下是我使用java 1.7.0_79

获得的内容
  

回复代码:200

     

密码套件:TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

     

证书类型:X.509证书哈希码:10920939证书公钥算法   :RSA证书公钥格式:X.509

     

证书类型:X.509证书哈希码:6561088证书公钥算法:   RSA证书公钥格式:X.509

     

证书类型:X.509证书哈希码:8774863证书公钥算法:   RSA证书公钥格式:X.509

以及java 1.8.0_77的输出

  

响应代码:200密码套件:   TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

     

证书类型:X.509证书哈希码:-106561125证书公钥   算法:RSA证书公钥格式:X.509

     

证书类型:X.509证书哈希码:771393018证书公钥算法   :RSA证书公钥格式:X.509

     

证书类型:X.509证书哈希码:349192256证书公钥算法   :RSA证书公钥格式:X.509

哈希码是否相同或我在这里遗漏了什么?

2 个答案:

答案 0 :(得分:1)

同一程序的不同执行之间的hashCode()并不相同,更不用说不同的Java版本了。你正在调用错误的方法。你应该打电话给X509Certificate.getSerialNumber()

答案 1 :(得分:0)

java.security.cert.Certificate的hascode()方法已更改。至少对于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

允许哈希码在jdk版本之间进行更改。主要用途是将Object存储在HashMap中。完全忽略了将对象的哈希码传递给“外部”或持久化它。

如果您需要证书的哈希,我建议您实现自己的哈希函数,这样您就不会依赖于允许更改的内部行为。

如何计算Java对象的哈希码没有严格的算法。实现者只需要与hashcode()和equals()契约对齐。

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