繁体   English   中英

使用X509指纹验证证书

[英]Validate Certificate Using X509 Thumprint

我已经成功阅读了X509证书的ThumbPrint。 是否可以使用指纹值来验证证书? 我只想要安全的服务器证书验证。

public class certificate {    

    public static void main(String[] args) {
        FileInputStream is;
        try {
            is = new FileInputStream("certificate.crt");
            CertificateFactory x509CertFact = CertificateFactory.getInstance("X.509");
            X509Certificate cert = (X509Certificate)x509CertFact.generateCertificate(is);

            String thumbprint = getThumbPrint(cert);
            System.out.println("Thumb Print : " + thumbprint);

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }    

    public static String getThumbPrint(X509Certificate cert) 
        throws NoSuchAlgorithmException, CertificateEncodingException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] der = cert.getEncoded();
        md.update(der);
        byte[] digest = md.digest();
        return hexify(digest);
    }

    public static String hexify (byte bytes[]) {
        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', 
                '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        StringBuffer buf = new StringBuffer(bytes.length * 2);

        for (int i = 0; i < bytes.length; ++i) {
            buf.append(hexDigits[(bytes[i] & 0xf0) >> 4]);
            buf.append(hexDigits[bytes[i] & 0x0f]);
        }

        return buf.toString();
    }      

}

是否可以使用指纹值来验证证书?

是。


我只想要安全的服务器证书验证。

请注意,如果您要验证Google(和其他网站),则指纹大约每30天更改一次。 这是因为Google使用了短期证书(有效期为30天)来使吊销列表(CRL)易于管理。 但是,Google重新认证了相同的公钥,因此您可以固定公钥而不是证书。

有关固定的更多信息,请参见OWASP的证书和公钥固定

另外,IETF还具有针对HTTP的主动公钥固定扩展

最后,您可以通过安全性多样化策略将所有这些提升到一个新的水平。 请参阅Peter Gutmann的Engineering Security

证书摘要本身没有任何意义。 我不知道有任何基于证书的方案使用SHA-1或证书正文的任何​​其他类型的摘要作为验证证书的唯一方法。

java.security.cert.Certificate API有一个定义明确的方法,可以使用应该属于颁发证书的授权机构的公钥来验证证书(这导致了证书链的概念)。

正确的证书验证应使用java.security.cert.CertPathValidator API,并提供应检查其有效性的证书或证书链以及包含受信任CA根的信任库。 验证的核心思想是检查链中的每个证书是否已使用链中下一项目的公钥签名,并且最后一个证书是否在受信任的根中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM