java - Https 连接是否信任,如果 Https 证书公钥相同?(HttpClient5)
问题描述
在 PKI 系统中,您可以使用 CA 公钥来验证证书:
x509Certificate.verify(CAPublicKey);
但我只想信任指定的证书,而不是整个 CA 和他签署的所有证书。您无法使用自己的公钥验证证书这不起作用然后抛出异常:
x509Certificate.verify(currentCertificatePublicKey);
java.security.SignatureException: Signature does not match
所以我尝试这样做:
x509Certificate.getPublicKey().getEncoded().equals(currentCertificatePublicKey);
这工作,但我不确定是否安全。我做了一些研究,但我仍然不能 100% 确定,因为没有人像那样使用 https,所以问题是:
有没有可能在没有证书私钥的情况下欺骗 https 客户端?(TLS_1.2)
解决方案
使用.equals
on 数组比较它们的内容是不正确的。
这将检查两个数组是否是同一个对象。
正确的使用方法是Arrays.equals()
。
Array.equals() :
如果两个数组包含相同数量的元素,并且两个数组中所有对应的元素对相等,则认为两个数组相等。
https://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#equals(byte[],%20byte[])
byte[] certificatePublicKey = x509Certificate.getPublicKey().getEncoded();
byte[] storedPublicKey = currentCertificatePublicKey.getEncoded();
bool isPublicKeyCorrect = Arrays.equal(certificatePublicKey, storedPublicKey);