首页 > 解决方案 > 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)

标签: javahttpsx509certificate

解决方案


使用.equalson 数组比较它们的内容是不正确的。
这将检查两个数组是否是同一个对象。

正确的使用方法是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);

推荐阅读