【发布时间】:2012-05-11 18:58:36
【问题描述】:
我有一个 Web 应用程序需要客户端发送它的证书,并且服务器必须验证证书(即查看颁发者是否是有效的颁发者并存在于服务器的信任库中)。这是代码:
FileInputStream fin=new FileInputStream("C:/trustedca");
KeyStore anchors = KeyStore.getInstance("JKS","SUN");
anchors.load(fin, "server".toCharArray());
X509CertSelector target = new X509CertSelector();
FileInputStream fin1=new FileInputStream("C:/client.crt");
CertificateFactory cf=CertificateFactory.getInstance("X.509");
X509Certificate cert=null;
while (fin1.available() > 0)
{
System.out.println("in while---------");
cert =(X509Certificate) cf.generateCertificate(fin1);
}
target.setCertificate(cert);
PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, target);
CertPathBuilder builder = (CertPathBuilder) CertPathBuilder.getInstance("PKIX").build(params);
PKIXCertPathBuilderResult r = (PKIXCertPathBuilderResult) builder.build((CertPathParameters)params);<br>
但我得到一个例外:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid
certification path to requested target<br>
注意:
此处客户端发送的证书是 client.crt,用于签署 client.crt 证书的证书是密钥库“trustedca”中存在的 ca.crt。那为什么会出现这个异常呢?
【问题讨论】:
-
值得一提的是,通过查看这段代码,无法判断为什么 PKIX builder 无法构建路径。但是将 -Djava.security.debug=all 添加到 java 选项将提供构建器的调试输出,并且可以阐明问题。
标签: java certificate x509certificate keystore pkix