栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在Java中验证证书会引发异常-无法找到到请求目标的有效证书路径

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在Java中验证证书会引发异常-无法找到到请求目标的有效证书路径

如果您希望获得客户证书,请让JSSE为您完成所有这些工作。如果要为特定的连接使用自己的信任库,请配置JSSE以使用它。检查参考文档中的“
定制JSSE”部分。

这是

SSLContext
使用自定义信任库构建的简短示例。(
X509TrustManager
也可以使用其他更复杂的,但是您很少需要它。)

TrustManagerFactory tmf = TrustManagerFactory    .getInstance(TrustManagerFactory.getDefaultAlgorithm());KeyStore ks = KeyStore.getInstance("JKS");FileInputStream fis = new FileInputStream("/.../example.jks");ks.load(fis, null);// or ks.load(fis, "thepassword".toCharArray());fis.close();tmf.init(ks);SSLContext sslContext = SSLContext.getInstance("TLS");sslContext.init(null, tmf.getTrustManagers(), null);

如果您使用的是现有的应用程序服务器,则如何通过配置这一切将取决于服务器及其期望的配置方式。为此,使用JSSE还将确保密钥用法属性合适。

如果您通过其他方式获得证书并想要对其进行验证,则需要使用PKI
API
。如果遵循
使用PKIX算法验证证书路径

示例
,则应获得如下信息:

X509Certificate certToVerify = ...CertificateFactory cf = CertificateFactory.getInstance("X.509");CertPath cp = cf.generateCertPath(Arrays    .asList(new X509Certificate[] { certToVerify }));TrustAnchor trustAnchor = new TrustAnchor(caCert, null);CertPathValidator cpv = CertPathValidator.getInstance("PKIX");PKIXParameters pkixParams = new PKIXParameters(    Collections.singleton(trustAnchor));pkixParams.setRevocationEnabled(false);cpv.validate(cp, pkixParams);

检查来自validate的结果(当然,它没有引发验证异常)。在这里,为了简化起见,我禁用了吊销检查。您还可以设置

PKIXParameters
策略检查的其他方面。这可能变得非常复杂(以及为什么最好让默认的JSSE管理器为您这样做)。


您还在Security.SE上询问的其他问题中还询问了所有这些问题:
证书指纹的实际值是多少?

假设您有两个

X509Certificate
s:
serverCert
caCert
,您要在其中验证
serverCert
签名(与私钥匹配的私钥)
caCert

最简单的方法:

serverCert.verify(caCert.getPublicKey());

如果您想手动进行一些操作,请使用

Signature
API:

System.out     .println("Signature algorithm: " + serverCert.getSigAlgName());Signature sig = Signature.getInstance(serverCert.getSigAlgName());sig.initVerify(caCert.getPublicKey());sig.update(serverCert.getTBSCertificate());System.out    .println("Verified? " + sig.verify(serverCert.getSignature()));

假设算法为

SHA1withRSA
,您还可以计算摘要:

MessageDigest digest = MessageDigest.getInstance("SHA-1");digest.reset();digest.update(serverCert.getTBSCertificate());byte[] digestBytes = digest.digest();Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, caCert.getPublicKey());byte[] cipherText = cipher.doFinal(serverCert.getSignature());

摘要本身仅是使用结果的一部分

Cipher
serverCert.getSignature()
实际上,您所获得的是更复杂的ASN.1结构,其中包含摘要算法标识符,在这种情况下,
digestBytes
前缀应为以下内容:

SHA-1:   (0x)30 21 30 09 06 05 2b 0e 03 02 1a 05 00 04 14 || H.

(如果要正确分析ASN.1结构,BouncyCastle可能会有用。)

请注意,这都不验证时间有效性或任何其他属性。PKIX遵从性远远不止于检查签名(请参阅RFC 3820和5820)。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/452950.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号